GPU の内部カーネルの時間を測定したいのですが、NVIDIA CUDA でどのように測定するのですか? 例えば
__global__ void kernelSample()
{
some code here
get start time
some code here
get stop time
some code here
}
次のようなことができます。
__global__ void kernelSample(int *runtime)
{
// ....
clock_t start_time = clock();
//some code here
clock_t stop_time = clock();
// ....
runtime[tidx] = (int)(stop_time - start_time);
}
これは、2 つの呼び出し間のクロック サイクル数を示します。ただし、少し注意してください。タイマーは数秒後にオーバーフローするため、連続する呼び出し間のコードの継続時間が非常に短いことを確認する必要があります。また、コンパイラとアセンブラが命令の並べ替えを実行することにも注意する必要があるため、クロック呼び出しが SASS 出力で互いに隣り合って配置されないことを確認する必要がある場合があります (cudaobjdump
確認に使用)。
これを試してください。2つのイベント間の時間をミリ秒単位で測定します。
cudaEvent_t start, stop;
float elapsedTime;
cudaEventCreate(&start);
cudaEventRecord(start,0);
//Do kernel activity here
cudaEventCreate(&stop);
cudaEventRecord(stop,0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&elapsedTime, start,stop);
printf("Elapsed time : %f ms\n" ,elapsedTime);