CPUで実行されているシリアルプログラムとGPUで実行されているCUDAプログラムのパフォーマンスを比較したいと思います。しかし、パフォーマンスを公平に比較する方法がわかりません。たとえば、古いCPUと新しいGPUのパフォーマンスを比較すると、非常に高速化されます。
別の質問:自分のCUDAプログラムを論文で報告されている別のCUDAプログラムと比較するにはどうすればよいですか(両方とも異なるGPUで実行され、ソースコードにアクセスできません)。
CPUで実行されているシリアルプログラムとGPUで実行されているCUDAプログラムのパフォーマンスを比較したいと思います。しかし、パフォーマンスを公平に比較する方法がわかりません。たとえば、古いCPUと新しいGPUのパフォーマンスを比較すると、非常に高速化されます。
別の質問:自分のCUDAプログラムを論文で報告されている別のCUDAプログラムと比較するにはどうすればよいですか(両方とも異なるGPUで実行され、ソースコードにアクセスできません)。
公平を期すために、GPUにデータを出し入れするためのデータ転送時間を含める必要があります。非常に高速なCUDA関数を作成するのは難しくありません。本当の秘訣は、それを供給し続ける方法、または他の必要な作業と重複させることによってデータ転送のコストを隠す方法を理解することです。ルーチンが100%コンピューティングバウンドでない限り、時間単位ごとに実行される作業単位でのデータ転送を含めることは、実装がより多くの作業単位を処理する方法を理解するために重要です。
デバイス間の比較では、プロセッサコアごとの単位時間あたりに実行された作業単位を報告すると便利な場合があります。プロセッサごとのコアは、たとえば200コアと2000コアのCUDAデバイス間の大きな違いを正規化するのに役立ちます。
アルゴリズム(出力だけでなく)について話している場合は、並列実行の問題をどのように分解したか(たとえば、ブロック/スレッドの分散)を説明すると便利です。
デバッグビルドでパフォーマンスを測定したり、デバッガーで実行したりしていないことを確認してください。デバッグによりオーバーヘッドが追加されます。
作業サンプルが「ノイズフロア」よりかなり上になるように十分に大きいことを確認してください。完了するのに数秒かかるテスト実行は、ミリ秒単位で完了するテスト実行よりも多くの機能を測定し、環境の周囲ノイズを少なくします。作業単位をテスト実行時間で割って、セクシーな「ナノ秒あたりの単位」の数値を得ることができますが、実際にはそのように測定することはありません。
さまざまなGPUでのcudaプログラムの速度は、メモリ帯域幅、コアクロック速度、コア、使用可能なスレッド/レジスタ/共有メモリの数など、GPUの多くの要因によって異なります。そのため、異なるGPUでのパフォーマンスを比較することは困難です