/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

CUDA6で実行時間を取得する

最近CUDAを触り始め、現在はプログラミングガイドや、理研入門テキストを読みながら学習中です。

その中でプログラムの実行時間が知りたくなったので、以下のサイトを参考に実装したのですが……コンパイルエラーが出て動きませんでした。

/*タイマーを作成して計測開始*/
  unsigned int timer = 0;
  CUT_SAFE_CALL( cutCreateTimer( &timer));
  CUT_SAFE_CALL( cutStartTimer( timer));

// 処理

/*タイマーを停止しかかった時間を表示*/
  CUT_SAFE_CALL( cutStopTimer( timer));
  printf("Processing time: %f (msec)\n", cutGetTimerValue( timer));
  CUT_SAFE_CALL( cutDeleteTimer( timer));

調べてみたところ、どうやらCUDAのバージョンによって関数名やヘッダファイル等が違うそうで、以下のサイトによるとCUDA5からは以下のコードを使う必要があるようです。

#include <helper_functions.h>
#include <helper_cuda.h>
#include <helper_timer.h>

StopWatchInterface *timer=NULL; 
sdkCreateTimer(&timer); 
sdkResetTimer(&timer);  
sdkStartTimer(&timer);  

// 処理

sdkStopTimer(&timer);   
float time = sdkGetTimerValue(&timer);
sdkDeleteTimer(&timer);
printf("Processing time: %f (msec)\n", time);

これをコンパイルしてみたのですが……StopWatchInterfaceなど無いと言われてしまいました。

調べてみると、helper_timer.h等の一部のヘッダファイルは、 /usr/local/cuda-6.0/samples/common/inc 入っているようです。 この場所を読み込むようにコンパイルオプションを追加します。

% nvcc -I/usr/local/cuda-6.0/samples/common/inc -O0 -o hoge hoge.cu

これで実行時間が計れるはずです( 正確に計りたい場合はcudaEventRecord関数などを使うといいみたいです)。

実行環境

$ uname -a
Linux tegra-ubuntu 3.10.24-gf455cd4 #1 SMP PREEMPT Wed Jun 18 11:20:52 PDT 2014 armv7l armv7l armv7l GNU/Linux

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2013 NVIDIA Corporation
Built on Sat_Mar_15_02:05:29_PDT_2014
Cuda compilation tools, release 6.0, V6.0.1

お願い

CUDAに関しては勉強を始めたばかりなので、初心者向けにおすすめな本やサイトが有りましたら、教えていただけると嬉しいです。

よろしくお願いします。