パスで難航
- まず、サンプルが動くことを確認。
- "/home/ryamada/NVIDIA_CUDA_SDK/projects/matrixMul"にサンプルプロジェクトがあるので、それをやってみる。
- "/home/ryamada/NVIDIA_CUDA_SDK/bin/linux/release"以下に"matrixMul"という実行可能ファイルを作って、それを実行できればよいわけである。
ryamada@fugu release]$ ./matrixMul -bash: ./matrixMul: そのようなファイルやディレクトリはありません >|| -まずは、そのような実行可能ファイルがないことを確認。 -次に、"make"コマンドで、実行可能ファイルを作れることを以下で確認する。 [ryamada@fugu release]$ cd /home/ryamada/NVIDIA_CUDA_SDK/projects/matrixMul [ryamada@fugu matrixMul]$ make [ryamada@fugu matrixMul]$ cd /home/ryamada/NVIDIA_CUDA_SDK/bin/linux/release [ryamada@fugu release]$ ./matrixMul Processing time: 0.144000 (ms) Test PASSED Press ENTER to exit...
- 出来ました。
[ryamada@fugu release]$ cd /home/ryamada/NVIDIA_CUDA_SDK/projects/matrixMul
- 実は、ここにいたるまでに、"helloWorld"サンプルプログラムのコンパイルがうまくいかないことに難渋したので、この「実行可能ファイルの作成成功ディレクトリ」で、"helloWorld"を試してみることにしました。"hello0.cu"がそれです。ほとんどなにも"include"していない、素直なプログラムです。こちらからいただきました。
[ryamada@fugu matrixMul]$ ls Makefile matrixMul.cu matrixMul.linkinfo matrixMul_kernel.cu hello0.cu matrixMul.h matrixMul_gold.cpp obj [ryamada@fugu matrixMul]$ nvcc hello0.cu [ryamada@fugu matrixMul]$ ls Makefile hello0.cu matrixMul.cu matrixMul.linkinfo matrixMul_kernel.cu a.out hello0.linkinfo matrixMul.h matrixMul_gold.cpp obj [ryamada@fugu matrixMul]$ ./a.out Hello, world
- できました。"nvcc"がCのコンパイラとして動いていることまでわかります。
- "hello.cu"はこんなファイル
#include <stdio.h> int main(void) { printf("Hello, world\n"); return 0; }
- さて、次に、CUDAらしさのあるものを試します。こんなファイルです(こちらからいただきました)
#include <stdio.h> #include <cutil.h> int main( int argc, char** argv) { CUT_DEVICE_INIT(argc, argv); unsigned int timer = 0; CUT_SAFE_CALL( cutCreateTimer( &timer)); CUT_SAFE_CALL( cutStartTimer( timer)); CUT_SAFE_CALL( cutStopTimer( timer)); printf( "Processing time: %f (ms)\n", cutGetTimerValue( timer)); CUT_SAFE_CALL( cutDeleteTimer( timer)); CUT_EXIT(argc, argv); return 0; }
- こんな感じで試します。
[ryamada@fugu matrixMul]$ ls Makefile cuda001.cu hello0.linkinfo matrixMul.h matrixMul_gold.cpp obj a.out hello0.cu matrixMul.cu matrixMul.linkinfo matrixMul_kernel.cu [ryamada@fugu matrixMul]$ nvcc cuda001.cu cuda001.cu:2:19: error: cutil.h: そのようなファイルやディレクトリはありません
- "cutil.h"がないのですね。このあたりから泥沼です。パスが通っていないのかと追って、".bashrc"をいじってみたり、"nvcc"のインクルードオプション(-I)やライブラリーオプション(-L)を、"nvcc --help"でみて、試したりしてみました。NCIDIA_CUDA_SDKのインストール先が、個人ユーザのディレクトリなのがいけない、という意見もある(こちら)ので、みようみまねでパスを通すふり、とかしてみますが、うまくいきません。"nvcc xxx.cu -lcutil"とか、ちょっとよくわからないオプション指定("-lcutil")がわかるとうまくいくのかも・・・。げろげろとしたエラーはこんな感じ・・・
[ryamada@fugu matrixMul]$ nvcc cuda001.cu -I ~/NVIDIA_CUDA_SDK/commonlib /tmp/tmpxft_00006552_00000000-12_cuda001.o: In function `main': tmpxft_00006552_00000000-11_cuda001.ii:(.text+0x1f3): undefined reference to `cutGetCmdLineArgumenti' tmpxft_00006552_00000000-11_cuda001.ii:(.text+0x2aa): undefined reference to `cutCheckCmdLineFlag' tmpxft_00006552_00000000-11_cuda001.ii:(.text+0x329): undefined reference to `cutCreateTimer' tmpxft_00006552_00000000-11_cuda001.ii:(.text+0x365): undefined reference to `cutStartTimer' tmpxft_00006552_00000000-11_cuda001.ii:(.text+0x3a1): undefined reference to `cutStopTimer' tmpxft_00006552_00000000-11_cuda001.ii:(.text+0x3dd): undefined reference to `cutGetTimerValue' tmpxft_00006552_00000000-11_cuda001.ii:(.text+0x3f8): undefined reference to `cutDeleteTimer' tmpxft_00006552_00000000-11_cuda001.ii:(.text+0x443): undefined reference to `cutCheckCmdLineFlag' collect2: ld はステータス 1 で終了しました
- みんなのものとして、インストールして、そこで、一発「ばしっと」したパス設定とかをするのがよさそう。インストールしなおし???
- "matrixMul"をなぞるべく、そのソースから改変・改変をし続けてやるっていうのも、姑息なやり方で楽しいかもしれません。