2

OpenCL カーネルのボトルネックを見つけようとしています。Mac OS X で OpenCL プログラムをプロファイリングできますか? http://www.gremedy.com/でgDebugger を見つけましたが、実行するには 10.5 または 10.6 が必要です。AMD SDK は、Linux と Windows のみをサポートしています。

Mountain Lion 用のプロファイラーはありますか?

4

1 に答える 1

1

プロファイリング情報はどの程度詳細である必要がありますか?組み込みの内部プロファイラーを使用しても大丈夫ですか?
OpenCLキューは、CL_QUEUE_PROFILING_ENABLEフラグを使用して作成できます。


このようにして、実行したカーネルごとに次のことを確認できます。

  • エンキュー
  • あなたに提出されたOCL-デバイス
  • 開始
  • 終了しました

C ++-Bindingsを使用すると、キューの作成は次のようになります。

_queue = new cl::CommandQueue(_context, _device, CL_QUEUE_PROFILING_ENABLE );

プロファイリング情報の抽出は次のようになります。

1)プロファイリングするエンキューされたカーネルによって配信されたイベントオブジェクトを(配列に)保存します。

cl::Event evt;
_queue->enqueueNDRangeKernel( _kernel, cl::NullRange, _range, cl::NullRange, NULL, &evt); 

2)キューの実行後、プロファイリング情報を抽出します

std::vector<cl::Event> evts;

//add all events to this vector here
//cl::Event evt;
//_queue->enqueueNDRangeKernel( _kernel, cl::NullRange, _range, cl::NullRange, NULL, &evt); 
//evts.push_back(evt);

uint64_t param;
for (unsigned int i=0; i<evts.size(); i++)
{
    evts[i].getProfilingInfo(CL_PROFILING_COMMAND_QUEUED, &param);
    printf("%u: %llu", i, param);
    evts[i].getProfilingInfo(CL_PROFILING_COMMAND_SUBMIT, &param);
    printf(" %llu", param);
    evts[i].getProfilingInfo(CL_PROFILING_COMMAND_START, &param);
    printf(" %llu", param);
    evts[i].getProfilingInfo(CL_PROFILING_COMMAND_END, &param);
    printf(" %llu\n", param);
}
于 2012-10-11T05:54:03.623 に答える