ラベル cuda の投稿を表示しています。 すべての投稿を表示
ラベル cuda の投稿を表示しています。 すべての投稿を表示

2009/11/21

Ubuntu 9.04 64bit版にCUDA 2.3 SDKを入れてみた

CUDA 2.3がUbuntu 8.04 LTS向けにはリリースされていないので、サブマシンに9.04 Desktop amd64版を新規にインストールしました。

CUDAはNVIDIAのサイトから入れてみましたが、いろいろ2.2 SDKとは構成が違っていて戸惑っています。 OpenCLとディレクトリ構成が同じになったようですね…。

"~/NVIDIA_GPU_Computing_SDK/C/"ディレクトリでmakeが成功するまでには、追加でつぎのようにパッケージの追加が必要でした。

  • $ sudo apt-get install g++
  • $ sudo apt-get install mesa-common-dev libglu1-mesa-dev libxi6-dev libxmu-dev libglut3-dev

これとは別に"openssh-server"パッケージを入れて、リモートから作業できるようにしています。

CUDA 2.2 Toolkitとの見た目の違い

ライブラリが32bit版と64bit版の両方が添付されているので、古いプログラムで/usr/local/cuda/libを"-L"オプションに指定している場合、32bitのライブラリがサーチパスに入ってるので、64bitのオブジェクトコードとリンクできずにエラーになります。おそらくcommon.mkを修正すれば良いと思われます。

この他にも古いCUDAプログラムをダウンロードしてきた場合、そこに含まれる"lib/libcutil.a"のコンパイルに失敗するといった事例が出ています。[ 参考URL::CUDPP 1.1 compile errors (and fixes) (gcc 4.3.3-5ubuntu4) ] いくつかファイルを修正する他に、CUDA 2.3 SDKをコンパイルしていれば、そこに含まれるlibcutil.aなどのライブラリファイルをlibディレクトリにコピーしてくるだけでも解決できます。

この変更のため環境変数LD_LIBRARY_PATHか"/etc/ld.so.conf.d/"以下のファイルで、"/usr/local/cuda/lib"を指定していれば"/usr/local/cuda/lib64"に変更する必要もあります。

2009/02/15

cuda 2.1を試してみる

なんとなく遊んでいるサーバー用のマシンにPCI Expressが付いているので、"Quadro FX 370 Low Profile"を購入して載せてみた。
CUDAとしては中途半端でもったいない感じはしますが、そろそろメインデスクトップのマザーボードをAGP 8xなAM2NF3-VSTAから変更した時の事を考えました。 純粋にCUDAのテストに使うなら、G9x世代のミッドレンジよりハイエンドに属するボードでないと速さが実感できなくて、おもしろくないだろうなというのが使ってみた感想です。

しばらく前に出ていたCUDA 2.1 betaを入れていたのですが、今日になって2.1のリリースに気がついたのでドライバやらToolkitやらを入れ直しました。
環境はこんな感じです。

  • CPU: AMD Turion 64 MT-37
  • Memory: 1GB
  • Graphic Card: Quadro FX 370 Low Profile
  • OS: Ubuntu 8.04 LTS Server x86_64版
うーん、非力だなぁ。

さて、CUDA Zoneにある資料をみるとvecAddという関数の付いたサンプルプログラムが乗っています。これをちょっと変更しながら、いろいろ試してみました。
CUDA Zoneの学習ページにある「CUDAプログラミングモデルの概要」をみると、"cudaMalloc"と"CudaMemcpy"を使ってデータをやり取りする辺りが最低限必要な知識みたい。 サンプルを少し変更しながら、なんとか簡単なプログラムは書けるようになりました。

さて、お題は何にしようかなぁ、と考えてみて、いつも通り簡単なループを沢山回して素数をみつけるプログラムを書く事にしました。
アルゴリズムは「2より大きい自分自身以外の数で割れない事」を素直に確認します。 効率とか考えません。単純に自分自身以外の数で割れない事を計算から確認していきます。
このロジックは実用性は皆無だけれど、新しいプログラミング言語を学習する時は、適度にループと条件分岐と配列やらハッシュやらのデータ構造をなにか1つは使うし、時間もかからないので良く使います。
なにしろ結果を表示させて正しく動いているか確認が簡単ですから。 新しく勉強する言語では結果そのものが怪しいので、簡単に確認できる事が重要です。

とりあえず試した感想は、この程度の仕事だとCPUよりもちょっと早いかなぁぐらい。 単純に1関数で1つの素数判定(?そんなに大袈裟な事ではない)をさせた場合は、CPUよりも遅くなりました。 1回の呼び出しで適当な処理単位(#define WORKUNIT 256)分の数字について素数か判定させる処理を繰り返すと,ある程度はスケールするようでした。

idx = blockDim.x * blockIdx.x + threadIdx.x;
for(i=0; i<WORKUNIT; i++)
  target_number = (WORKUNIT * idx + i)
でもこの作業を割り振るためのユニットが最上位機種でFX 370の30倍ぐらいあるかと思うと、スケールする可能性は確かに感じました。
今回の例はシンプルすぎるから、メモリ空間にもっとアクセスするようなケースでないとCPUで処理をさせた時との差がわかりずらいかなと思います。 2次元の各画素に計算を適用するとか、音声信号に対するFFTみたいな操作で、ちゃんと動いているか検証も簡単な良いネタがあると良いですね。