我有一个内核,我需要多次执行(使用clEnqueueNDRangeEnqueue
),并且它的参数之一是一个整数,每次执行后都需要递增。
在让每个内核执行排队之前,不是让主机分配一个递增的值(使用clSetKernelArg
),而是一种纯粹的“设备端”方式来实现此目的,例如最终工作项运行后,内核本身是否会增加一个全局整数? (我还是OpenCL的新手,所以这里可能是树错了树。)
答案 0 :(得分:1)
有可能在内核方面实现这一目标,但我不会这样做,因为它可能会影响内核性能。无论如何,可以这样:
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的操作,但增加计数器并不是其中之一。