2016-11-14 2 views
0

私は同じアルゴリズムのcudaとcppの実装を持っています。cudaとC++コードに匹敵するタイム計測を行う方法

C言語で
cudaEvent_t start, stop; 
float time; 
cudaEventCreate(&start); 
cudaEventCreate(&stop); 

cudaEventRecord(start, 0);  // start time measurement 

// some cuda stuff 

cudaEventRecord(stop, 0);  // stop time measurement 
cudaEventSynchronize(stop);  // sync results 
cudaEventElapsedTime(&time, start, stop); 
printf ("Elapsed time : %f ms\n", time); 

++私はTIMEOFDAYで測定:

struct timeval start, end; 
long seconds, useconds; 
float mseconds; 
gettimeofday(&start, NULL); 

// some work to do 

gettimeofday(&end, NULL); 

seconds = end.tv_sec - start.tv_sec; 
useconds = end.tv_usec - start.tv_usec; 
mseconds = (seconds * 1000 + useconds/1000.0) + 0.5; 
printf ("Elapsed time : %f ms\n", mseconds); 

これはgood-同等の結果を得るための正しい方法ですCUDAに私はイベントとtimemeasurementを作りますか?

ありがとうございます!

+1

これが十分であれば、比較のためには問題ありません(ミリ秒の精度を見て、実行時間を長くしないでください)。 C++の標準的な方法でC++ 11以上のものを望むなら、[std :: chrono](http://en.cppreference.com/w/cpp/chrono) - 長期間の 'steady_clock'(システムを避けるC++の標準ライブラリとOSが提供できる精度のような精度のために 'high_resolution_clock'を使用しています。 –

+0

このスレッドも参照してください:http://stackoverflow.com/questions/728068/how-to-calculate-a-time-difference-in-c – Rames

答えて

0

はい、これはCPU-vs-GPUの時間比較を行う良い方法です。

もちろん、高解像度のシステムタイマから__rdtscの組み込み関数に至るまで、CPUのタイミングを取得する方法はいくつかあります。しかし、このような粗い比較のためにはうまくいくはずです。

あなたはGPUのパフォーマンスに深く掘ると改善の可能性がある領域を探したい場合は、あなたが同じことをして、コマンドラインCUDAプロファイラnvprof、またはVisual Profilerで、見てみたいが、また持っていることGUI。

0

CUDA関連のものの実行時間全体を単純に比較したい場合は、C++の時間測定を維持できます。これは、あなたのタスクがCPU側に比べCUDAとデバイス側にかかったどのくらいの時間を計算するための簡単な方法である

gettimeofday(&start, NULL); 

// some work to do 
cudaDeviceSynchronize(); 

gettimeofday(&end, NULL); 

:ちょうどあなたのデバイスは、経過時間をチェックする前に持っていたすべての単一のタスクを完了したことを確認します。

ApoorvaJが示唆しているように、デバイスのボトルネックがどこにあるかを確認するためにCUDAのパフォーマンスを深く理解する必要がある場合は、ビジュアルプロファイラを使用できます。 Visual Studioを使用している場合は、these stepsをチェックしてください。PTXコードをチェックしたい別のSOユーザーのために書きました。あなたはビジュアルプロファイラーが提供できる他のデータを探さなければなりません。 Nvidiaの公式CUDAドキュメントのProfiler sectionを確認してください。

関連する問題