最近ちっとも更新していない大島です.
お誘いを受けて職場を異動しました.なかなかこのページに書くのにちょうど良いネタがありません.しばらくは,日々のネタは「向こうのサイト」に,学会発表等の情報はwikiに書くつもりでいます.
以上,近況報告終わり.
最近ちっとも更新していない大島です.
お誘いを受けて職場を異動しました.なかなかこのページに書くのにちょうど良いネタがありません.しばらくは,日々のネタは「向こうのサイト」に,学会発表等の情報はwikiに書くつもりでいます.
以上,近況報告終わり.
投稿テスト by iPhone
新年度になり,新たにCUDAに関する研究を行ってみたいという学生が増えてくるだろうということで,ざっとメモしておきます.
ちなみにLinuxを用いる場合はこちら.(記述が古いですが,まぁ大枠は一緒でしょう.)
ここでは最低限の環境としてビデオカードを無視した内容を記述します.CUDA対応GPUが搭載されていなくても大丈夫です.なお,OSはWindowsXP Professionalを想定しています.他のWindowsの場合は適宜読み替えてください.
ToolkitとSDKはCUDA 2.3 Downloadsからダウンロードし,順番にを実行してインストールしましょう.(日本語サイトを利用する場合はこちら:CUDAプログラミングツールキットのダウンロード.私は習慣的に本家を利用していますが,おそらくどちらでも大丈夫.)
CUDA対応GPUを搭載しているPCの場合はついでにドライバも導入しておきましょう.
VisualStudioは,持っていない場合はMicrosoft Visual Studio 2008 Express EditionからVisualC++2008ExpressEditionを入手しましょう.無料で利用できます.(大学生・大学院生の場合は先生や事務に問い合わせると無料で上位の製品が使えたりすることもあるようです.)
CUDA ToolkitはデフォルトでC:\CUDAにインストールされます.
CUDA SDK code samplesはデフォルトでC:\Document and Settings\All Users\の中にインストールされますが,ここではC:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDKにインストールしたとして話を進めます.(少し前のバージョンまではこちらでした.)
VisualStudioはデフォルトでC:\Program Files\Microsoft Visual 9.0にインストールされます.
インストールが終わったら,コマンドプロンプトを開き(ファイル名を指定して実行からcmd.exe),nvcc(nvcc.exe)とcl(cl.exe)が実行できることを確認しましょう.実行できない場合はそれぞれのパス(C:\CUDA\binおよびC:\Program Files\Microsoft Visual Studio 9.0\VC\bin)を環境変数PATHに追加してください.(詳細な操作手順はweb検索すればすぐにわかるので説明しません.)
なお,nvccが実行できない場合はCUDA_BIN_PATH,CUDA_INC_PATH,CUDA_LIB_PATH(それぞれC:\CUDA以下のbin,include,lib)なども追加されていないかもしれません.(再インストールした方が良いかも?)
clは実行するとmspdb80.dllが無いなどと言った警告が出るかもしれませんが,ここでは無視して構いません.
以上で準備が整いました.
それでは実際にコードを記述しコンパイルしてみることにします.
今回は先ほどインストールしたCUDA SDK code samplesに含まれているプログラムを利用してみます.
C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\projects
以下に多数のサンプルがインストールされており,それぞれ.slnファイルが同梱されています.
C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\projects\deviceQuery\deviceQuery_vc90.sln
を開いてビルドすれば実行ファイルが生成され,実行すればCUDA対応GPUが搭載されていなくてもデバイスエミュレーションで動きます.(GPUの性能がコマンドプロンプトにテキスト表示されます.)
また,deviceQuery.cppを別の作業フォルダにコピーし,拡張子をcuに変更し,コマンドプロンプトから
>nvcc deviceQuery.cu -I”C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc” -L”C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib” -lcutil32 -o deviceQuery
とすれば実行ファイルdeviceQuery.exeが作成されます.
こうして作成されたdeviceQuery.exeは実行しようとするとcutil32.dllが無いと怒られてしまうので,実行前に
C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\lib\cutil32.dll
を
C:\Windows\sytem32
以下にコピーしておきましょう.
以上,CUDAに触れるための方法を簡単にまとめてみました.テキストばかりで書いてしまいましたが,難しいところは特に無いと思います.
ちなみにこの記事は私が実際にVM上のWindowsXP Professionalでやったことのメモなので,うまく動かないということはそうそう無いと思いますが,何か記述抜けなどがあるかもしれないので,不具合などありましたら気軽にコメントで指摘してやってください.
今回のプログラム(deviceQuery)はGPUの情報を取得するだけのプログラムであり,この段階ではまだGPUは何も計算していません.実際に計算させる方法については,また機会があれば書くかも?(過去に書いた記事がカバーしている上に,それこそサンプルを見れば良い気がするのであまり必要性は感じませんが.)
昔作ったものを発掘.
誰かの参考になるかも知れないのでとりあえずアップしておきます.
単純なLU分解を適当にBlock並列化.Block並列化に走ったので変な同期関数(MPI_Barrierというなの強引なBlock間同期)が入っているあたりはちょっと謎ですが,作成したのがかなり前なのでよくわかりません.
特に価値のあるソースコードでもないので,いわゆる「煮るなり焼くなり好きにしろライセンス」扱いでどうぞ.
実験的に行列積の並列化を行っていたところ、突然実行結果が合わなくなるという症状に見舞われた。
今のところ、BLOCKとTHREADの数を増やし、__syncthreadsを多く使うことで安定している気はする。
少なくとも10sec制限には引っかかっていない。
Sharedメモリを少し叩いているので、その辺が悪さをしているのだろうか?意外と難しい。こういうときにどうやってバグを発見・排除すればよいのか……。
(__syncthreadsが少ない時に全く同一の問題設定で計算結果が狂うことがあることを考えると、恐らく__syncthreadsの使いどころを間違えているのであろうと予想することはできる。)