2012-01-20 27 views
1

いいえ、 CPU上で計算をしていて、その数値をGPUに転送してそこで動作させます。私は、CPU + GPUでの計算に要した合計時間を計算したいと思います。どうすればいいですか?CPU + GPUの合計時間を計算する方法

答えて

0

プログラムが起動すると、main()でシステムタイマーを使用して時間を記録します。あなたのプログラムがmain()の最後で終了したら、同じシステムタイマーを使って時刻を記録します。 time2とtime1の差を取る。そこに行く!

使用できるシステムタイマーはいくつかありますが、他のタイマーより高解像度のものもあります。ここでそれらについて話すのではなく、SOサイトで「システムタイマー」を検索することをお勧めします。任意のシステムタイマーが必要な場合、gettimeofday()はLinuxシステム上で動作しますが、新しい、より高精度の関数に取って代わられています。つまり、gettimeofday()は時間をマイクロ秒単位で測定するだけで、必要に応じて十分です。

十分な分解能でタイマーを得ることができない場合は、プログラムをループで何度も実行し、ループの実行を計時し、測定された時間をループ反復回数で除算することを検討してください。

EDIT:

システムタイマーは、GPUの計算中に使用される時間を含む全アプリケーションのパフォーマンスを測定するために使用することができます。このようにシステムタイマーを使用することは、処理時間ではなく、実際の、または壁時計の時間にのみ適用されることに注意してください。ウォールクロック時間に基づく測定には、GPUの処理が完了するまでの時間が含まれていなければなりません。

GPUカーネルの所要時間を測定する場合は、いくつかのオプションがあります。まず、Compute Visual Profilerを使用してさまざまなプロファイリング情報を収集することができますが、時間を報告するかどうかはわかりませんが、基本的なプロファイリング機能です。他のプロファイラ - PAPIが気になる - CUDAカーネルのサポートを提供する。

また、CUDAイベントを使用して時間を記録することもできます。 CUDAイベントを使用して時間を測定する方法については、「CUDA 4.0プログラミングガイド」を参照してください。

さらに別のオプションは、GPUカーネル呼び出しをラップしたシステムタイマーを使用することです。カーネル呼び出しの非同期性が返される場合、このメソッドを適用するには、cudaThreadSynchronize()などのホスト側GPU同期呼び出しを使用してカーネル呼び出しに従う必要があります。このオプションを使用する場合は、ループ内でカーネルを呼び出すことを強くお勧めします(ループ内ではcudaThreadSynchronize()は必要ありません)。反復回数で除算することによって計算されます。

+0

これらのシステムタイマは、GPUでの計算にかかる時間も考慮していますか?私はそうは思わない...間に、私はコードのセクションの時間を設定したい。したがって、メインの起動だけで助けにならない – Programmer

+0

@Programmer私の編集を確認してください。 – Patrick87

0

GPUが動作しているかどうかにかかわらず、Cタイマーは動きます。もしあなたが私のことを信じていないなら、この小さな実験をしてください:をループに、GPU_Function_Callを1000回繰り返します。ループの周りにCタイマーを置く。今、あなたがプログラムを実行すると(GPU関数が20msのようなかなりの時間を費やしていると仮定します)、あなたはそれが復帰する前に肉眼で数秒間動くのを見ます。しかし、Cの時間を印刷すると、数ミリ秒のように表示されます。これは、Cタイマーが1000 MemcpyHtoDと1000 MemcpyfromDtoHと1000カーネルコールを待たなかったからです。私が提案する何

は、完全な時間を測定する(ヒューマンエラーを減らすために反復を増やす)、時間GPUと使用ストップウォッチにCUDAイベントタイマーまたはより良いNVIDIAビジュアルプロファイラを使用することです。 CPU時間を得るために合計からGPU時間を引くだけです。

+0

あなたの最初のポイントは厳密には真ではありません。はい、カーネルの起動は非同期ですが、標準のmempcpy APIがブロックされているので、ホストタイマーは正しいウォールクロック時間を記録します。 – talonmies