OpenCL clEnqueueNDRangeKernel阻止进一步的主机执行

时间:2019-02-15 09:42:32

标签: parallel-processing opencl gpgpu gpu-programming

根据我的理解,您应该能够将多个内核(作业)推送到命令队列,然后等待它们完成。但是,对我而言似乎并非如此。每次我以GPU作为设备调用clEnqueueNDRangeKernel时,函数clEnqueueNDRangeKernel都会阻止主机(CPU)上的进一步执行。该实现与按CPU作为设备的预期工作一样,因此仅当内核在GPU上运行时才会出现此问题。内核只是一个虚拟内核,对私有变量执行一些加法和乘法运算而没有参数。我尝试了两种不同的笔记本电脑,它们具有相同的结果,一种带有Intel i5(第四代)CPU和Nvidia GPU(Geforce 840M),另一种带有Intel i5(第八代)和集成GPU。

以下输出可能有助于您理解问题,CPU提供了例外的输出:“ clEnqueueNDRangeKernel中的时间”比“完成两个内核的时间”少得多。

执行设备为
GPU:
clEnqueueNDRangeKernel中的时间(秒):13.6459
clEnqueueNDRangeKernel中的时间(秒):13.6244
完成两个内核所需的时间(秒):27.2704
CPU:
clEnqueueNDRangeKernel中的时间(秒):4.205e-05
clEnqueueNDRangeKernel中的时间(秒):6.732e-06
完成两个内核的时间(秒):0.727572

代码:

...
Profiler timer1;
timer1.ResetTime();
Profiler timer2;
timer2.ResetTime();
err = clEnqueueNDRangeKernel(commands, kernel, 1, NULL, global, NULL, 0, NULL, NULL);
checkError(err, "Enqueueing kernel");

std::cout << "Time (sec) in clEnqueueNDRangeKernel: " << timer2.GetTime() << std::endl;
timer2.ResetTime();

err = clEnqueueNDRangeKernel(commands, kernel, 1, NULL, global, NULL, 0, NULL, NULL);
checkError(err, "Enqueueing kernel");

std::cout << "Time (sec) in clEnqueueNDRangeKernel: " << timer2.GetTime() << std::endl;

err = clFinish(commands);
checkError(err, "Finish command queue");

std::cout << "Time (sec) to finish two kernels: " << timer1.GetTime() << std::endl;

谢谢您的时间!

0 个答案:

没有答案