【发布时间】:2012-10-06 08:49:49
【问题描述】:
我正在尝试通过 OpenCL 开发一个可以同时利用 CPU 和 GPU 的应用程序。具体来说,我有两个内核,一个用于 CPU 执行,一个用于 GPU。 CPU内核会改变一个缓冲区的内容,当GPU检测到缓冲区被CPU改变时,GPU会做其他事情。
__kernel void cpuKernel(__global uint * dst1,const uint size)
{
uint tid = get_global_id(0);
uint size = get_global_size(0);
while(tid < size)
{
atomic_xchg(&dst1[tid],10);
tid += size;
}
}
__kernel void gpuKernel(__global uint * dst1, __global uint * dst2, const uint size)
{
uint tid = get_global_id(0);
uint size = get_global_size(0);
while(tid < vectorSize)
{
while(dst1[vectorOffset + tid] != 10)
;
dst2[vectorOffset + tid] = dst1[vectorOffset+tid];
tid += size;
}
}
如上所示,cpuKernel会将dst1缓冲区的每个元素都更改为10,相应地,GPU检测到这种变化后,会将元素值(10)分配到另一个缓冲区dst2的相同位置。 cpuKernel 在与 CPU 设备关联的 command1 中排队,而 gpuKernel 在与 GPU 设备关联的 command2 中排队,两个命令队列已设置 CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE 标志。 然后我提出两种情况: 案例一:
clEnqueueNDRangeKernel(command2,gpuKernel);
clEnqueueNDRangeKernel(command1,cpuKernel);
clfinish(command1);
clfinish(command2);
案例2:
clEnqueueNDRangeKernel(command1,cpuKernel);
clfinish(command1);
clEnqueueNDRangeKernel(command2,gpuKernel);
clfinish(command2);
但结果显示,两种情况消耗的时间几乎相同,但我预计情况1会有一些重叠,但没有。谁能帮我?谢谢!
或者,任何人都可以帮助解释如何在 OpenCL 中实现在两个设备上异步运行的两个内核?
【问题讨论】:
标签: asynchronous opencl