パスで難航

  • まず、サンプルが動くことを確認。
  • "/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"をなぞるべく、そのソースから改変・改変をし続けてやるっていうのも、姑息なやり方で楽しいかもしれません。