2010年1月20日水曜日

GT 240 の CUDA-Z 結果

GeForce GT 240 1GB ZONE Edition(型番:ZT-20404-20L)
CUDA-Z実行結果

1.core

2. memory


3. performance



GT240の理論ピーク性能は
( 8CUDAコア×2演算※1+2SFU×4演算※2 )×12CUDAプロセッサ ×1.34GHz = 385 GFLOPS
※1 積和
※2 4乗算
255GFLOPSというのは(SFUを使わずに)CUDAコア全部が稼働している状態と思われる。
NVIDIA GeForce GT 240 (NVIDIA)
GeForce 200 series (wikipedia)
Fermi概要 (fixstars)

2010年1月19日火曜日

Geforce GT 240 の性能 in CUDA

NVIDIAのドライバ(ver 190.42)ではGT 240の性能が出ない場合があるらしいので性能を測定してみる。私のPCではGT 240のファンレスモデルを使っている。

OS :Fedora 12 (x86_64)
ドライババージョン:195.30
ビデオカード:GeForce GT 240 1GB ZONE Edition (ZT-20404-20L)

でCUDA SDKのbandwidthを実行すると、

Running on......
      device 0:GeForce GT 240
Quick Mode
Host to Device Bandwidth for Pageable memory
.
Transfer Size (Bytes)    Bandwidth(MB/s)
 33554432        803.7

Quick Mode
Device to Host Bandwidth for Pageable memory
.
Transfer Size (Bytes)    Bandwidth(MB/s)
 33554432        647.4

Quick Mode
Device to Device Bandwidth
.
Transfer Size (Bytes)    Bandwidth(MB/s)
 33554432        21741.0
となった。
  • host→device 0.8 GB/s  (2.7 GB/s)
  • device→host 0.65 GB/s (2.4 GB/s)
  • device→device 22 GB/s
括弧内は --memory=pinned の場合。
PCI Express x16 の帯域が4 GB/sなのでhost<->deviceは実効15~67%程度
GT 240 の帯域は 32 GB/s なので device<->deviceは実効69%程度
とまずまずの結果。

2010年1月15日金曜日

eclipseでCUDA

eclipseでCUDA開発する時の設定

Linux
Makefileの設定以外基本的には通常のC/C++と同じ。NVIDIA SDKのmakefile,common.mk等を流用する場合は必要ファイルまるごとコピーして、その後Makefileのtarget等を変更する。Fedora12の場合、nvccに--compiler-bindirオプション等でgcc34、g++34が呼ばれるようにしないといけない。

便利な設定

  • ファイルタイプの追加
ウインドウ→設定→C/C++→ファイルタイプ に.cuをC++ソースファイルとして追加


  • CUDA独自の修飾子で"syntax error"を出さないようにする
cuda_runtime.hをインクルードするか、

あるいは
#ifdef __CDT_PARSER__
#define __global__
#define __device__
#endif

などと書いておく


  • カーネル呼び出しの三重ブラケット
現時点では対処法無し。



Eclipse + CUDA on Windows
windows版eclipseでもmakeコマンドが使えればMakefileにコンパイラやフラグの設定を書くだけで、Linuxの場合とほぼ同様にコンパイルできる(素直にVS使った方が良いという話もあるが)。なのでまずMingWをインストールしておく。幸いnvccはwindows版でもLinux版と同じようなオプションが利用できるのでifdef等で簡単に切り替えることもできる。

  • 実行ファイルへパスを通す
Windowsのコントロールパネル→システム→詳細設定→環境変数 で、
  1. makeコマンドへのパス(d:¥msys¥1.0¥bin)
  2. nvccコマンドへのパス(D:¥CUDA¥bin)
  3. cl.exeコマンドへのパス(D:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥bin)
へのパスを追加する。区切りはセミコロン;なので
PATH=D:¥msys¥1.0¥bin;D:¥CUDA¥bin;D:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥bin
となる。

  • インクルードパスの追加
インクルードパスを通す。ここで必要なインクルードパスはCUDAとVC++のヘッダファイルへのパスである。(mingwではない)

プロジェクトで右クリックし、 C/C++一般→パスおよびシンボル のインクルードタブに
  1. VC++のインクルードディレクトリ(D:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥include)
  2. CUDAインクルードディレクトリ
  3. CUDA SDK インクルードディレクトリ
を追加する。 
あるいはnvcc実行時に-Iオプションでインクルードパスを通しても良い。


  • ライブラリへのパスを通す
Windowsの場合kernel32.libをリンクする必要が出るので、nvcc実行時に
-L"C:¥Program Files¥Microsoft SDKs¥Windows¥v6.0A¥Lib" -lkernel32
をつける。(ようにmakefileを書くか、eclipseの方で設定する)

2010年1月7日木曜日

Linux Fedora 12 + Geforce GT 240 でCUDA

1. NVIDIA ドライバのインストール

  • ドライバの入手
NVIDIAのwebページでGT 240 用 Linux ドライバを検索しても該当無し、という結果が返される。オフィシャルに対応している分けではなさそうだが、195.30あたり以降なら動作可能らしいので適当なビデオカードで検索してドライバのファイルをダウンロードする。

  • ドライバインストール準備
Fedora12ではnVIDIA用ドライバとしてnouveauがインストールされており、これはプロプライエタリドライバと競合する。そこでgrubでkernel指定する時 nouveau.modeset=0をつけてnovuveauドライバが起動しないようにする
kernel /vmlinuz-2.6.31.9-174.fc12.x86_64 ro root=/dev/md1 rhgb quiet LANG=ja_JP.UTF-8 KEYTABLE=jp106 nouveau.modeset=0

  • ドライバインストール
ランレベル3で起動してXの動いていない状態で
sudo sh NVIDIA-Linux-x86_64-195.30-pkg2.run
を実行。インストール完了。後は適当にxorg.confを編集して nvidia ドライバを有効にする。/usr/share/doc/NVIDIA_GLX-1.0/ あたりを参照。インストーラで実行するか聞いてくる、自動設定スクリプトを走らせても大体動く。


2.CUDAインストール
  • ファイルのダウンロード
CUDAダウンロードページで「オペレーションシステム→Linux64ビット」、「Linux版→Fedora10」を選択し、出てくる
  1. CUDAツールキット cudatoolkit_2.3_linux_64_fedora10.run
  2. CUDA SDK     cudasdk_2.3_linux.run
をダウンロードする。CUDAダウンロードページのCUDAドライバは既にビデオカードのドライバが入っていれば不要。というか、大体CUDAダウンロードページのドライバの方が古い。

  • インストール
CUDAツールキットをrootユーザーで実行・インストールする。
sudo sh cudatoolkit_2.3_linux_64_fedora10.run

CUDA SDKを一般ユーザーで実行・インストールする。
sh cudasdk_2.3_linux.run
  • 共通設定
パス、ライブラリパスを通す。
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH;/usr/local/cuda/lib64
を.bash_profileに追加


3.CUDA設定 for Fedora12
  • gcc34のインストール
Fedora12(や11)のgcc4.4にCUDAは対応していない。このためgcc3.4をインストールする。
yum install compat-gcc-34 compat-gcc-34-c++
でインストール


  • コンパイル時の変数設定
ソースをコンパイルするときに、Cならgcc34、C++ならg++34を用いるようにmakefileを書き換える。例えばSDKのサンプルNVIDIA_GPU_Computing_SDK/C/common/common.mkの場合
CXX := g++34
CC := gcc34
LINK := g++34 -fPIC
など。また、nvccはC/C++の部分をコンパイルする時にgcc/g++を呼ぶので、gcc34を「gcc」g++34を「g++」で呼ぶようにする必要がある。gcc/g++がどこにあるかは --compiler-bindir オプションで指定できるので /tmpに
ln -s /usr/bin/gcc34 gcc
ln -s /usr/bin/g++34 g++
とリンクを張っておき、前述common.mkで
NVCCFLAGS := --compiler-bindir=/tmp
と修正する。これでNVIDIA_GPU_Computing_SDK/C/でmakeすればSDKのサンプルはコンパイル可能。

2009年2月6日金曜日

STLの accumulate と find_if

vector vecの和は

double sum = accumulate( vec.begin(), vec.end(), 0.0, plus< double >() );


こんな感じ。結構面倒くさい。 plus<> 等は functional にある。

vecが昇順に整列済みなら、
*find_if( vec.begin(), vec.end(), bind2nd( greater< double >(), x) );

でxより大きい最初の値を得ることが出来る。

plus
minus
multiplies
divides
modulus
negate
equal_to
not_equal_to
less
less_equal
greater
greater_equal
logical_and
logical_or
logical_not
等など。

templateクラスのfriend宣言

templateクラスのfriend宣言は

1.最初にtemplateクラスの前に宣言する。
2.templateクラスでfriend宣言する。
3.クラスの外で内容を書く。

friend関数がtemplate関数の場合

friend int& operator += <> (int& x, int&y);


のように名前の後にブラケットをつけてtemplate関数であることを示す必要が有る。

2008年5月4日日曜日

stringstreamについて

C++では stringstream は非推奨。
sstreamをインクルード。

出力にはostringstream を使用。