2012-05-14 36 views
16

GPUの内部カーネルを測定したいのですが、どのようにNVIDIA CUDAで測定するのですか?例: NVIDIA CUDAの内部カーネル時間を測定する方法は?

__global__ void kernelSample() 
{ 
    some code here 
    get start time 
    some code here 
    get stop time 
    some code here 
} 
+0

Amin(数年前)あなたは有用な情報である回答を受け入れましたが、あなたの実際の質問には答えません。答えを反映させるために質問を受け入れないで編集してもいいですか? – einpoklum

答えて

5

これを試すと、2つのイベントの間隔がミリ秒単位で測定されます。 2回の呼び出しの間のクロックサイクル数を示します

__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); 
} 

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); 
+19

そのコードはカーネル内で使うことはできません。これは質問が求めていることです。 – talonmies

+0

@talonmies:だから、この答えは質問に答えることはできませんが受け入れられます。私たちは何をすべき?多分質問を編集しますか? – einpoklum

+0

複数のGPUでopenmpスレッドでカーネルを動かすと、このコードは0msの結果を返します – newbieee

33

あなたはこのような何かを行うことができます。少し注意してください。タイマーは数秒後にオーバーフローしますので、連続するコール間のコードの持続時間が非常に短いことを確認してください。また、コンパイラとアセンブラは命令の並べ替えを実行するので、クロックコールがSASS出力で隣り合わせになっていないことを確認したい場合があります(チェックするにはcudaobjdumpを使用してください)。

+0

私はテストして正しく動作しません。 clock()はホスト関数であり、デバイス関数ではありません。 – Amin

+5

'clock()' **は**デバイスの機能であり、実際に動作します。 'clock()'と 'clock64()'の説明については、CUDAプログラミングガイドのB10節を参照してください。それが「正しく動作しない」場合は、何か間違ったことをしているか、出力が何を意味するのか誤解しています。 – talonmies

+0

出力はクロックサイクルです。秒に変換するには? – Amin

関連する問題