我试图在我的 OpenCL 内核中找到瓶颈,是否可以在 mac os X 上分析 OpenCL 程序?我在http://www.gremedy.com/上找到了 gDebugger ,但它需要 10.5 或 10.6 才能运行。AMD SDK 仅支持 Linux 和 Windows。
山狮有分析器吗?
我试图在我的 OpenCL 内核中找到瓶颈,是否可以在 mac os X 上分析 OpenCL 程序?我在http://www.gremedy.com/上找到了 gDebugger ,但它需要 10.5 或 10.6 才能运行。AMD SDK 仅支持 Linux 和 Windows。
山狮有分析器吗?
您的分析信息必须有多详细?可以使用内置的内部分析器吗?
可以使用 CL_QUEUE_PROFILING_ENABLE 标志创建 OpenCL 队列。
这样你就可以看到你执行的每个内核
:
使用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, ¶m);
printf("%u: %llu", i, param);
evts[i].getProfilingInfo(CL_PROFILING_COMMAND_SUBMIT, ¶m);
printf(" %llu", param);
evts[i].getProfilingInfo(CL_PROFILING_COMMAND_START, ¶m);
printf(" %llu", param);
evts[i].getProfilingInfo(CL_PROFILING_COMMAND_END, ¶m);
printf(" %llu\n", param);
}