OpenCL内核的定时执行
Timing execution of OpenCL kernels
这是OpenCL内核执行时间的正确计时方式吗?我非常喜欢使用c++包装器(不幸的是,它没有太多计时示例)。
cl::CommandQueue queue(context, device, CL_QUEUE_PROFILING_ENABLE, &err);
checkErr(err, "Cannot create the command queue");
/* Warm-up */
for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
{
err = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(512), cl::NullRange, NULL, NULL);
checkErr(err, "Cannot enqueue the kernel");
}
queue.finish();
/* Time kernels */
cl::Event start, stop;
queue.enqueueMarker(&start);
for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
{
err = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(512), cl::NullRange, NULL, NULL);
checkErr(err, "Cannot enqueue the kernel");
}
queue.enqueueMarker(&stop);
stop.wait();
cl_ulong time_start, time_end;
double total_time;
start.getProfilingInfo(CL_PROFILING_COMMAND_END, &time_start);
stop.getProfilingInfo(CL_PROFILING_COMMAND_START, &time_end);
total_time = time_end - time_start;
/* Results */
cout << "Execution time in milliseconds " << total_time / (float)10e6 / NUMBER_OF_ITERATIONS << endl;
我认为您的方法应该可以正常工作(不是吗?)。或者,如果要对每次调用计时,可以将一个事件传递给enqueueNDRangeKernel
,然后在该enqueueNDRangeKernel
上调用getProfilingInfo
。
cl::Event evt;
err = queue.enqueueNDRangeKernel(kernel, cl::NullRange, cl::NDRange(512), cl::NullRange, NULL, &evt);
evt.wait();
elapsed += evt.getProfilingInfo<CL_PROFILING_COMMAND_END>() -
evt.getProfilingInfo<CL_PROFILING_COMMAND_START>();
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- Ardunio UNO解决了多个重叠的定时器循环
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 执行函数时导致崩溃的变量
- 无论条件是否为true,if总是在c++中执行
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 在C++中对T*类型执行std::move的意外行为
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在没有信号的情况下从C++执行QML插槽
- 如何确认我的constexpr表达式实际上已经在编译时执行
- C++17中的并行执行策略
- QML按钮点击功能执行顺序
- 程序在执行程序的其余部分之前退出
- 为什么catch中的代码没有被执行
- 正确使用 std::condition_variable 触发定时执行
- Linux/c++ 定时方法,尽管有漂移,但每 N 秒执行一次
- C++定时器暂停程序的执行直到完成
- OpenCL内核的定时执行