每次内核执行后OpenCL递增整数
我有一个需要多次执行的内核(使用每次内核执行后OpenCL递增整数,opencl,Opencl,我有一个需要多次执行的内核(使用clenqueuendrangequeue),它的一个参数是一个整数,每次执行后需要递增 不是让主机在排队执行每个内核之前分配递增值(使用clSetKernelArg),而是有一种纯粹的“设备端”方法来实现这一点,例如,在运行最终工作项后,让内核本身递增一个全局整数?(我对OpenCL还是新手,所以可能在这里弄错了方向)。在内核方面可以实现这一点,但我不会这么做,因为这可能会影响内核性能。无论如何,可以这样做: kernel void my_kernel(__gl
clenqueuendrangequeue
),它的一个参数是一个整数,每次执行后需要递增
不是让主机在排队执行每个内核之前分配递增值(使用
clSetKernelArg
),而是有一种纯粹的“设备端”方法来实现这一点,例如,在运行最终工作项后,让内核本身递增一个全局整数?(我对OpenCL还是新手,所以可能在这里弄错了方向)。在内核方面可以实现这一点,但我不会这么做,因为这可能会影响内核性能。无论如何,可以这样做:
kernel void my_kernel(__global int* counter, __global int* other_data, ...)
{
// some operations on other_data, etc.
// make sure that only one work item increments the counter to avoid race condition
// the assumption is that kernel uses one dimension only
if(get_local_id(0) == 0)
atomic_inc(counter); // need to use atomic function as kernels may run in parallel
}
因此,为了进行总结,而不是通过仅使一个工作项工作并浪费其他工作项的周期来添加分支,我将继续在主机端使用
clSetKernelArg
和增量计数器。有些操作更适合GPU,增加计数器不是其中之一。这不会在最后一个工作项运行时增加值。每当第一维度中具有全局_id的工作项碰巧完成时,它都会递增该值。