2011-11-02 7 views
0

OpenCLアプリケーション(特にコンピューティングカーネル)のパフォーマンスを表す最も適切な方法は何ですか? 私はいくつかのアルゴリズムを実装しており、スピードアップと効率のグラフを提示することを考えていましたが、定義によれば、計算で使用したプロセッサの数を知る必要があります。 OpenCLの場合は実行できません。OpenCLパフォーマンス測定

答えて

0

私は、一部のGPUには正確に時間を測定するハードウェアデバイスがないと信じています。つまり、CPUに戻る必要があるかもしれません。しかし、私は間違っているかもしれません。

+0

私は計算時間のグラフをタスク次元の関数として提示すべきだと思いますか? –

+0

おそらくはい、私はそうだと思いますが(私は完全にはわかりません)。 –

3

CL_QUEUE_PROFILING_ENABLEフラグが設定されたコマンドキューを作成し、clGetEventProfilingInfoを使用してタイミングデータを抽出します。詳細は、「OpenCLプログラミングガイド」の第9章を参照してください。

+0

NvidiaのOpenCLプログラミングガイド?そのような本がありますか?ちょっとだけ精度が上がるでしょう。ありがとう。 – BRabbit27

+0

はい、Aaftab Munshiの "OpenCL Programming Guide"という本があります。 Google検索の最初のリンクです。 – vocaro

1

私はあなたが望むことをするために言語/ランタイムの機能を活用しているので、ボカロの提案は最もCLに適していると思います。ただし、何らかの理由でプラットフォーム上でうまく動作しない場合は、特定のCL操作のウォールクロック実行時間にのみ関心がある場合は別の解決方法があります。

clFinish()で操作をラップし、システムの最高解像度タイマを使用して経過時間を取得することができます。一例としてのMac OS Xを使用して、このような何か、:

uint64_t start, end; 

clFinish(command_queue); 
start = mach_absolute_time(); 
clEnqueueNDRangeKernel(command_queue, /* etc. */); 
clFinish(command_queue); 
end = mach_absolute_time(); 

あなたはナノ秒に、この絶対時間に変換するためにApple QA1398の情報を使用することができます。このメソッドは、clEnqueuNDRangeKernelとclFinishのオーバーヘッドを含んでいるため、イベントプロファイリングを使用する場合ほど正確ではありません。

完了の呼び出しは、保留中のCLコマンドが両方とも計算デバイスに送信されたことを保証します。

1

nVidiaのベストプラクティスガイドには、パフォーマンス測定に特化した章があります。まもなく、これは次のようになります。外部タイマー(@Jamesの提案)を使用するか、GPUプロファイリングメカニズム(@vocaroの提案)を使用できます。私は個人的にCPUタイマーを使用して簡単にすることに固執していますが、後者はより良い精度を提供する必要があります。私は私が使用するプロセッサの数を直接使用者によって制御される計算

これは、マルチCPUの並列化のために真である、で使用しているどのように多くのプロセッサを知っておく必要があります定義に従って

。これはGPUの場合ではありません.GPUを使用することはできますが、デバイス内のスケジューリングを制御することはできません。 (実際には、私が今までに見たすべてのCPU対GPUチャート上に)「SpeedUp(問題次元)」(「マーケティング」プレゼンテーション用)または「SpeedUp(カーネルオプション)カーネルオプションは、グリッドパラメータまたはいくつかのコードの特殊性であるかもしれません)または "スピードアップ(使用されたGPUの数)"(あなたのプログラムがマルチGPUをサポートしている場合)

関連する問題