SSブログ

テクスチャメモリについて [CUDA]

CUDAのコードを書いていると、最適化を行う際はまずスレッド/ブロックをどうするか、Shared Memoryをどうするかとかを考えるが、今回テクスチャメモリを使ってみた。
これまで、テクスチャユニットを使うようなことは無いと思っていたが、テクスチャメモリをバインドすることによって、普通に配列にアクセスするのと同様にできるようなので、ちょっと試してみた。
まずテクスチャメモリを使う方法としては最低限下記のが必要。

<宣言>
texture< float, 1, cudaReadModeElementType > texfA;

<テクスチャメモリをグローバルメモリとバインド>
何かグローバルメモリに確保されたメモリのポインタをpgA、
確保したサイズをAllocOnGlobalByteSizeなどとする。
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc();

cudaBindTexture(NULL, texfA, pgA, channelDesc, AllocOnGlobalByteSize));

が最低限必要。実際に使う場合はtex1Dfetch()関数を使って、1D配列と同様に、
a = tex1Dfetch(texfA,Index);

のように使う。ただし、いくつか制限があり、グローバルメモリのアライメントが512バイト(Fermiの場合)でないと動作しないので、アライメントは考慮しなくてはならないのが面倒。また、ホストへの転送をまとめてやりたいがために、複数の確保すべきメモリを1次元配列にまとめて確保し、それぞれをオフセットしたポインタで表している場合は、アライメントを考慮しづらい場合がある。そのような場合は確保した領域のベースポインタに対し、テクスチャをバインドし、アクセス時に下記のようなoffsetを追加してあげる事によって使えるようになる。
a = tex1Dfetch(texfA, offset + Index);

しかしながらテクスチャメモリは、何も考えないでコードを書いてパフォーマンスが出ない場合などに用いると効果が出やすいが、ある程度考えられたコード(shared memoryなど)では逆に遅くなってしまう場合がある。




nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

EclipseでCUDAを使う その2 [CUDA]

EclipseでCUDAのファイルを開くと、CUDA専用の関数などがハイライトされずかなり見づらい状況が続いていたが、ちょっと調べてみたら、下記のやり方でOKだった。

1)プロジェクト名を右クリックー>「プロパティ」ー>「C/C++一般」ー>「パス及びシンボル」ー>「インクルード」タブに/usr/local/cuda/includeを追加。

2)device_launch_parameters.h、device_functions.hをインクルード。

3)Eclipseのメニューの「ウィンドウ」ー>「設定」ー>「C/C++」ー>「エディター」ー>「構文の色」ー>「コード」ー>「マクロ参照」の使用可能にするをチェック。

これによってとりあえず赤の波線は出なくなる。__global__などの色はお好みの色で。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

EclipseでCUDAを使う [CUDA]

EclipseでCUDAを使う場合、通常includeファイルやlibの設定をしてあげればOKだけど、注意点としてはMakeファイルを自動にしないで自分で書くようにする。プロパティー>C/C++の設定で設定を行う。

あと、cuやcuhに関しては、C++ファイルとして登録しておく。その際は
*.cu
*.cuh
としておかないとC++のファイルとして認識されない。あとなぜCではなくC++かというと、
予約語の関係で、例えばexternとかはC++でないと認識されない。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

CUDAのプログラミングの覚書 [CUDA]

CUDAのコードを書いていて、たまに理解しがたいエラーがでることがあるが、
大抵はメモリ周りのエラーでホストからデバイスへの転送がうまく行ってないことが多い。
Fermiからデバイス側でprintfが使えるようになったのは非常に助かるようになった。
とはいえ、同じ間違いを何度も繰り返してしまうので、ちょっとメモしておく。

1)構造体のサイズに注意。
ホスト側とデバイス側で同じ構造体を扱っているのに、転送でエラーになることがある。
多くの場合で、ホストとデバイス側でサイズが異なっている。構造体の中身を変更したときなどに起こる。一旦プロジェクトをクリーンして再ビルドをすればうまく行くことが多い。

2)ホスト側にデバイスの情報を置き忘れ。
カーネルの引数にポインタを持ってくる場合に、デバイス側のメモリのポインタを保持していない、
またはホスト側のポインタを与えてエラーになることが多い。

3)CUDAのコードを実行すると数回に1回の割合でうまく動作してしまう場合はメモリ周りに問題がある。しっかしデバッグをしないとあとで痛い目にあう。

4)デバイス側のメモリを確保しても必ずしもデータは0クリアされていない。また、First Touchの問題か、エラーがでることがあるので、CudaMemsetで初期化を忘れない。

5)Tookitの出来によってパフォーマンスが変わる。例としては4.0=>4.2で一割ほど改善があった。

6)シェアードメモリをexternで使う場合はカーネル引数を忘れずに。

7)Threadはあまり意識しなくてもいいが、BlockとGridは意識する。

8)なるべく多くの処理をCUDAデバイス側でやらないとパフォーマンスが得にくい。

ちょっと思っただけでもこのくらいか。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

CUDA 4.0 SDKをUbuntu 11.04にインストールする。 [CUDA]

CUDA 4.0 SDKをUbuntu 11.04にインストールする。

CUDA 4.0が出ていた。なにやらだいぶコードが書きやすくなっているようだ。
試してみたくて、SDKをダウンロードしてインストールするも、NVIDIAのサポートは10.10まで。
つまりgcc4.5はサポートしないでgcc4.4までをサポート。
したがってgcc4.4が必要となる。
Sampleのビルドやり方は基本これと同じ方法だが、若干の変更が必要。

Ubuntu 10.04 AMD64 LTSでのCUDA環境インストール

[user@host ~]$ sudo apt-get install build-essential gcc-4.4 g++-4.4 libxi-dev libxmu-dev freeglut3-dev

gpucomputingsdk_4.x.xx_linux.runをインストールしたら、(ここではデフォルトの~/NVIDIA_GPU_Computing_SDK)
以下のファイルを書き換える。
 ~/NVIDIA_GPU_Computing_SDK/shared/common.mk
 60 CXX        := g++
 61 CC         := gcc
 62 LINK       := g++ -fPIC
 93 NVCCFLAGS  :=  
ー>
 60 CXX        := g++-4.4
 61 CC         := gcc-4.4
 62 LINK       := g++-4.4 -fPIC
 93 NVCCFLAGS  :=  --compiler-bindir /usr/bin/gcc-4.4

 ~/NVIDIA_GPU_Computing_SDK/C/common/common.mk、~/NVIDIA_GPU_Computing_SDK/CUDALibraries/common
 59 CXX        := g++ -fPIC                          
 60 CC         := gcc -fPIC                          
 61 LINK       := g++ -fPIC  
 92 NVCCFLAGS  :=
ー>
 59 CXX        := g++-4.4 -fPIC                          
 60 CC         := gcc-4.4 -fPIC                          
 61 LINK       := g++-4.4 -fPIC  
 92 NVCCFLAGS  := --compiler-bindir /usr/bin/gcc-4.4
 
 ~/NVIDIA_GPU_Computing_SDK/OpenCL/common/common_opencl.mk
 69 CXX        := g++
 70 CC         := gcc
 71 LINK       := g++ -fPIC
->
 69 CXX        := g++-4.4
 70 CC         := gcc-4.4
 71 LINK       := g++-4.4 -fPIC

とりあえずこれでOK。


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

”はじめてのCUDAプログラミング”に関して [CUDA]

少し前に下記の本を購入した。この本はおそらく日本で初めてCUDAプログラミングに関して執筆されたもので、内容も初歩的なものからシェアードメモリの最適化まで記載されておりこれで2300円はかなりリーズナブルだと思う。CUDAに関しての市販の書籍数はおそらく日本が世界で一番多く、その次に中国のようだ。このあたりはアングロサクソンとアジア系のものの考え方が違うのだろうか?

はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)

はじめてのCUDAプログラミング―驚異の開発環境[GPU+CUDA]を使いこなす! (I・O BOOKS)

  • 作者: 青木 尊之
  • 出版社/メーカー: 工学社
  • 発売日: 2009/11
  • メディア: 単行本

さて、この本はCUDAのプログラミングを学ぶのには十分過ぎると思われる(当然C/C++の知識が必須だが)。しかしながら、自分には気になることがあった。それは、いくつかの章でCPUの結果を引き合いに出して、「XX倍速くなりました!!!」と書いてあるのだが、自分の経験からしてCPUの結果があまりにも遅いように思えた。そこで実際に自分の環境ではどうなのか実験してみた。

まず自分の環境は下記の通り。このGTX285は2GBのメモリを搭載しているので、シェーダークロックが若干遅めで1.16GHz
Corei7 860(DDR3-12800 8GB)+ GTX285(2GB)
それに対し、このほんの著者の青木先生の実行環境
Corei7 920 + GTX285 ( シェーダー1.4GHz?)
とのこと。

この本のサンプルコードはここからダウンロードできる。
http://www.kohgakusha.co.jp/support/cuda/index.html
(試したい方はこの本を買ってからにしてください。)

実験の内容は12章の「差分法による偏微分方程式の計算」において、一番最適化されてあるはずの”sample7_linux”の中のcuda_diffusion2d_3()関数を使ったものを実行してみる。設定としては要素数1024X1024、Block数はx=128,y=8(この設定が一番パフォーマンスが出るようだ。)で実施。以下結果

GPU(GTX285):50.0GFlops

青木先生の環境では63GFlopsが出ているので、ちょっと遅いが、自分のGTX285のシェーダークロックが少し遅いことを考えるとまあ、妥当な結果。

次にCPUのコードを実行してみる。

CPU(1コア):1.6GFlops

すごく遅い(笑)その差30倍以上。でも青木先生の環境では0.7GFlopsなので、倍以上速いのはなんかおかしいと思い始めてしまった。(笑)
そもそも1024X1024のサイズでは配列の必要サイズは8MB程度なので、Corei7は8MBのL3キャッシュを持っており、ほぼキャッシュサイズに収まる。GT200ではいわゆるコア(SM)が240個あるが、Corei7は4コア。しかし、CPUはクロックはほぼ倍、SSEを使えば4要素扱えるので、単純にGPUに換算すると32個のSMに相当する。しかし、今の結果では1コア(2SM相当)しか使っていないので、実質120倍程度の差が出てもおかしくない。

じゃあ、CPUを最適化してみたらどうなるかということをやってみた。まずは単純にOpenMPを使って4スレッド(4コア)を使うと、

CPU(4コア):6.6GFlops

あらら、だいぶ速くなった。それでもGTX285の方が約7.6倍速い。
Corei7はHyper Threading対応なので8スレッドあるが、この手の計算ではコンテキストスイッチの切り替えによるオーバーヘッドでかなり遅くなってしまうため、物理コア数とスレッド数を同じにしている。続いてSSEを使ってみる。

CPU with SSE(1コア):6.2GFlops

SSEなしに比べて、4倍近くになった。
さらにOpenMPを使って実施。

CPU with SSE(4コア):11.2GFlops

意外と伸びなかったが、それでもかなり速くなった。そのほかにいろいろと最適化して、
最終的に出てきたCPUの結果は以下の通り、

CPU with SSE+Optimized(4コア):18.0GFlops

・・・・かなりいけている。GPUとの差は約2.8倍程度しかない。Tesla10XXシリーズならもっと縮まるんじゃないだろうか。
この本では「CPUを使って91倍なりました!」とかかれているのだが、90倍と3倍じゃ全く意味大きく異なる。足かせのしている陸上選手に馬に乗って追い抜いたからといって意味があるのか?というレベル。入門書だからといってこのようなことを書くのはいかがなものだと思うし、コンピュータサイエンスの専門家であるなら、せめてSSE位は使った比較を行ってほしいものだ。初心者が勘違いしてGPUなら100倍近く速くなるはずだと思いこんでしまう危険性があるのでやめてほしい。

(チラシの裏:予算を取るとか、自分の成果を表現するために誇張してしまうのは仕方がないんだけど。実際に学会とかでもかなり恣意的な比較が多かった。さすがにその様な発表は査読ではじかれるようになってきているが。)

参考までにSSEのコード。このくらいなら別に書くのに時間はかからないと思う。
(GCC限定。ICCを使う場合は組み込み関数を使わないといけないので、やや面倒になる。)


  1 void  cpu_diffusion2d_sse                                                                                                              
  2 (
  3    float    *f,         /* dependent variable                        */
  4    float    *fn,        /* updated dependent variable                */
  5    int      nx,         /* x-dimensional grid size                   */
  6    int      ny,         /* y-dimensional grid size                   */
  7    float    c0,         /* coefficient no.0                          */
  8    float    c1,         /* coefficient no.1                          */
  9    float    c2          /* coefficient no.2                          */
 10 )
 11 // --------------------------------------------------------------------
 12 {
 13      int    jx,   jy;
 14 
 15      Vec4f vc0 = _mm_load_ps1(&c0);
 16      Vec4f vc1 = _mm_load_ps1(&c1);
 17      Vec4f vc2 = _mm_load_ps1(&c2);
 18 
 19      Vec4f  vfcc,  vfce,  vfcw,  vfcs,  vfcn;
 20      Vec4f  *vf,  *vfn;
 21 
 22      vf  = (Vec4f *)f;
 23      vfn = (Vec4f *)fn;
 24 
 25      int vnx = nx>>2;
 26      int vjx,vj;
 27 
 28      for(jy = 0; jy < ny; jy++) {
 29          for(vjx = 0; vjx < vnx; vjx++) {
 30              vj = vnx*jy + vjx;
 31              vfcc = vf[vj];
 32 
 33              if(vjx == 0) vfcw = _mm_shuffle_ps(vfcc,vfcc,_MM_SHUFFLE(0,0,1,2));
 34              else{
 35                  vfcw = _mm_shuffle_ps(vf[vj],vf[vj],_MM_SHUFFLE(2,1,0,0));
 36                  vfcw = _mm_move_ss(vfcw,_mm_shuffle_ps(vf[vj-1],vf[vj-1],_MM_SHUFFLE(3,3,3,3)) );
 37              }
 38 
 39              if(vjx == vnx - 1) vfce = _mm_shuffle_ps(vfcc,vfcc,_MM_SHUFFLE(1,2,3,3));
 40              else{
 41                  vfce = _mm_move_ss(vf[vj],vf[vj+1]);
 42                  vfce = _mm_shuffle_ps(vfce,vfce,_MM_SHUFFLE(0,3,2,1));
 43              }
 44 
 45              if(jy == 0) vfcs = vfcc;
 46              else        vfcs = vf[vj-vnx];
 47 
 48              if(jy == ny - 1) vfcn = vfcc;
 49              else             vfcn = vf[vj+vnx];
 50 
 51              vfn[vj] = vc0 * (vfce + vfcw)
 52                      + vc1 * (vfcn + vfcs)
 53                      + vc2 * vfcc;
 54          }
 55      }
 56 }

ちなみにGPUはスレッドがたくさん生成できればより速くなるので、もっと大きな問題たとえば2048x2048サイズを行うと、もっと差は縮まる拡がるがそれでも6倍程度で、メモリ帯域の差とほぼ同じになる。従って、CUDAをつかってどれくらいパフォーマンスが出るかは今回のようなケースではメモリ帯域の比較を行えば、概ね予測ができるはず。
nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

サポートされていないバージョンでのCUDA環境インストール Linux [CUDA]

先にUbuntu 10.04の場合のCUDA環境のインストールを書いた。

では、他のディストリ、特にFedoraの場合はどうかというと、Fedoraのリポジトリにはgcc-4.3は残念ながら無い。そこで重い腰をあげ、他バージョンのgccをインストールことにする。

まず、gccのサイトに行き、下記から必要なバージョンのgccソースをダウンロードしてくる。
今回は、gcc-4.3.4を取ってきた。

ダウンロードリンク

ここから、

gcc-4.3.4.tar.bz2
gcc-core-4.3.4.tar.bz2
gcc-g++-4.3.4.tar.bz2

を取ってくる。

続いて、

[user@host ~]$ tar -xvzf gcc-*

で解凍する。(書庫マネージャでもよい。)
これらを解凍するとgcc-4.3.4に全て解凍されるので、

[user@host ~]$ cd gcc-4.3.4

へ移動する。

[user@host ~]$ ./configure --program-suffix=-4.3.4

を実行する。途中足りないライブラリがあるとか言われる可能性があるので、その場合は

[user@host ~]$ sudo yum install gmp-devel mpf-devel

といった感じでインストールする。どのライブラリ分からない場合は、下記のように検索すれば大抵見つかる。今回のような場合はコンパイルすることが必要なので大抵はパッケージ名に-devel等の開発を表す名前がついている。

[user@host ~]$ sudo yum provides mpfr.h

[user@host ~]$ sudo yum search mpf

あとは普通のアプリと同じように、

[user@host ~]$ make

[user@host ~]$ sudo make install

でOK。コンパイルには結構時間が掛かるので、

[user@host ~]$ make -j4

など並列Buildを行っても良い。(うまく動作しなかったら、並列Buildをまずは疑ってみる)
ちなみにFedora12の場合はデフォルトで、

[user@host ~]$ which gcc-4.3.4
/usr/local/bin/gcc-4.3.4

にインストールされていた。あとはUbuntu 10.04の場合と同じようにCUDAの設定を行えばインストールが可能。意外と簡単にいけたので驚いた。以前gccをコンパイルしようとしたときはうまくいかなかったので、その経験がじゃまをしていたのかもしれない。もっともそのときよりも知識がついたからであるのだが。あとインストールが可能と書いたのは、OpenGLに問題があって一部で実行できないサンプルがあるため。Ubuntuでは発生しなかったので、おそらくnouveauが関係しているかも。

追記:Fedora12でこの方法を用いると、SDKのアプリはビルド出来るが、その他の場合でlibcutil.aのリンクでエラーが出る場合がある。その場合はgccではなく、g++に変更しなければならない。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Ubuntu 10.04 AMD64 LTSでのCUDA環境インストール Linux [CUDA]

以前、最新のUbuntuやFedoraではgccのバージョンの関係でコンパイルできないので、仮想化環境でインストールするという記事を書いた。

仮想化環境におけるCUDAのインストール

確かにこれでも良いんだけど、やっぱり面倒くさい。かといってgccをコンパイルするのも面倒だし、それ以外の設定があることを考えると躊躇していたのだが、Ubuntu 10.04にはgcc 4.3を簡単にapt-getでインストール出来るようにいなっていた。ものは試しと、早速インストールしてみた。

[user@host ~]$ sudo apt-get install g++-4.3

g++-4.3をインストール指定するだけで、必要なパッケージは自動的にインストールできる。

CUDAのSDKやtoolkitは特に特別は必要なく、単純にインストールすれば良い。(SDKやtoolkitはOSのバージョンチェックは行わない)

ただ、このままではコンパイルすることが出来ないので下記の様な作業が必要
まず、gcc-4.3がどこにインストールされているかチェック

[user@host ~]$ which gcc-4.3
/usr/bin/gcc-4.3

続いて、SDKをインストールしたフォルダ、たとえば下記

/home/user/NVIDIA_GPU_Computing_SDK/C/common

に移動して、common.mkを一部編集する。

89 # architecture flag for nvcc and gcc compilers build
90 CUBIN_ARCH_FLAG :=
91 CXX_ARCH_FLAGS :=
92 NVCCFLAGS :=
93 LIB_ARCH := $(OSARCH)
ー>
89 # architecture flag for nvcc and gcc compilers build
90 CUBIN_ARCH_FLAG :=
91 CXX_ARCH_FLAGS :=
92 NVCCFLAGS := --compiler-bindir=/usr/bin/gcc-4.3
93 LIB_ARCH := $(OSARCH)

これを保存して、

[user@host ~]$ cd ../

[user@host ~]$ make

でコンパイルが出来るようになる。途中Xmuとかが無いよといわれるかもしれないけど、そのときは、

[user@host ~]$ sudo apt-get install libxmu-dev

といった形でインストールしていけばよい。
Ubuntu 10.04の64bit環境の場合、libcutil.aが自動的に作られないので、
その場合は、

[user@host ~]$ cd /home/user/NVIDIA_GPU_Computing_SDK/C/lib

[user@host ~]$ cp libcutil_x86_64.a libcutil.a

とすればよい。

普通に使える。これであえて仮想化環境をインストールする必要が無くなった。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

仮想化環境におけるCUDA 3.0のインストール [CUDA]

仮想化環境におけるCUDA 3.0のインストール

CUDA toolkitはいくつかのディストリビューションに対応しているが、
余り最新のバージョンには対応していない。
おそらくnvccがgccを内部で呼んでいるため、gccのバージョンについて行けていないからだと思う。
Fedoraで10まで、Ubuntuで9.04までしか対応しておらず、Fedora13、Ubuntu10.4がリリースされようとしている時にこれは辛い。
CUDAの環境構築のためにわざわざ古いバージョンを入れたくはないので、仮想化環境で開発環境を構築する。

VirtualBOXをインストールして、Ubuntu9.04をインストールする。デフォルトの環境ではg++等CUDAに必要ライブラリが入っていないので、以下をインストール

user@host-desktop:sudo apt-get install g++ libXi-dev libXmu-dev freeglut3 freeglut3-dbg freeglut3-dev

続いてCUDA toolkitをNVIDIAからダウンロードする。現時点では下記のファイルが最新

cudatoolkit_3.0_linux_64_ubuntu9.04.run
gpucomputingsdk_3.0_linux.run

user@client-desktop:sudo chmod +x cudatoolkit_3.0_linux_64_ubuntu9.04.run
user@client-desktop:sudo bash ./cudatoolkit_3.0_linux_64_ubuntu9.04.run
user@client-desktop:bash ./gpucomputingsdk_3.0_linux.run

これ以降は以前書いた
http://am112705.blog.so-net.ne.jp/archive/c2300742966-1
これと同じなので省略。

ただこのままだと、SDKのコンパイルが通らない。どうも最新版ではドライバ側のライブラリlibcuda.soが必要なようで、
それがないと-lcudaがないといわれてしまう。
さて困ったところなんだが、仮想化環境のホスト側はおそらく最新のドライバが入っていると思うので、
ホスト側で
user@host-desktop:locate libcuda
と探してみる。自分の環境ではこのように現れた。

/usr/lib/libcuda.so
/usr/lib/libcuda.so.1
/usr/lib/libcuda.so.195.36.15
/usr/lib64/libcuda.so
/usr/lib64/libcuda.so.1
/usr/lib64/libcuda.so.195.36.15

自分が使っているのは64bitなので、/usr/lib64/libcuda.so*をごっそりクライアント側の/usr/lib64/にコピーする。
これでSDKがすべてコンパイル出来るようになる。

CUDAでのコンパイル [CUDA]

CUDAはいろんなプラットフォームに対応しており、当然Linuxも対応済み。ただし、Linuxの場合はどうも対応ディストリが古い(ディストリというよりもコンパイラのバージョンが古い)ので、最新のFedora12やUbuntu9.10ではコンパイルが通らない。従ってCUDAのコードをコンパイルするには、NVIDIAが対応してくれるのを待つか、古いバージョンのコンパイラを導入するかどちらかしか今は無いようだ。しかしながら前者を待っているのは時間の無駄なので、後者をやりたいところだが、バージョンの違うコンパイラ入れるのは何となく気が引けるので、ここは仮想化マシンを使ってコンパイル出来るようにする。CUDAのnvccはgccを使っているので、コンパイル自体はクロスコンパイルでも何でもかまわない。従って仮想化マシンでのコンパイルは可能

やり方としてはかなり単純。まず、VirtualBoxにUbuntu8.04 LTSをインストールする。(今回はUbuntu64bit版だけど、Fedoraでも、OpenSUSEでもOK)

インストールが終わったら、必要なアップデート、GCCなどをインストールしておく。

後は、NVIDIAのサイトから、そのバージョンが対応したtoolkitとSDKをインストールする。ここで注意したいのはNVIDIAは仮想化ドライバを提供していないので、driverをインストールしても意味がない。(出来ないと思う)

最後に仮想化マシンのユーザーの環境設定を下記のように行う。CUDAのデフォルトインストールディレクトリは/usr/local/cudaなので、.bashrcに下記を追加

PATH=$PATH:/usr/local/cuda/bin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64

export PATH LD_LIBRARY_PATH

上記が記述出来たら、環境を更新

[user@host ~]$ source ~/.bashrc

あとついでに/etc/ld.so.confにも下記の一行を追加しておく(もちろん管理者権限で)

/usr/local/cuda/lib64

 追加したら下記を実行

[user@host ~]$ sudo ldconfig

しかしながら、このままではコンパイルしようとすると、-lcutilが無いといわれてしまうので、SDKをインストールしたディレクトリの~/NVIDIA_CUDA_SDK/commonに行き、makeを実行する。そうすると、 NVIDIA_CUDA_SDK/libにlibcutil.aが生成されるのでコンパイルが出来るようになる。

さて、仮想マシンでコンパイルしたバイナリをホストマシンに持ってきただけでは動かないので、ホストマシンも仮想マシンと同様に最低限toolkitと環境設定をする必要がある。それが出来れば実行可能となる。下記スクリーンショット。Fedora12でもCUDAのサンプルbandwidthtestが実行できているのがわかる。

Screenshot.jpg

 


CUDA2.3をUbuntu 9.04 amd64へインストール [CUDA]

Ubuntu 9.04
CUDA 2.3インストールメモ

1)NVIDIAのサイトから下記のファイルをダウンロード

cudadriver_2.3_linux_64_190.18.run
cudasdk_2.3_linux.run
cudatoolkit_2.3_linux_64_ubuntu9.04.run

2) ランレベルを変更して、Ubuntuではランレベルが標準で2なので、ランレベル1で起動。
$init 1

3)1)のファイルの順番にインストールしていく
$sudo bash ./cudadriver_2.3_linux_64_190.18.run
&sudo bash ./cudasdk_2.3_linux.run
$bash ./cudatoolkit_2.3_linux_64_ubuntu9.04.run

実行時にインストールパスなどをきかれる。実際にディレクトリがないとNGになるので、デフォルト以外のディレクトリにインストールする場合はあらかじめディレクトリを作っておく必要がある。

 4)PATHの設定をする~/.bashrcに追加。
64bit環境であれば、LDライブラリはlib64を設定する

PATH=/usr/local/cuda/bin:$PATH
LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

5)下記のファイル類をインストールしておく
sudo apt-get install libXmu-dev
sudo apt-get install libglut3-dev
(これ以外に必要になるかも)

これでCUDAのプロジェクトをコンパイルできるようになるが、
コンパイル時に警告がたくさん出る。


この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。