每次执行内核后,OpenCL递增整数

时间:2018-11-08 08:55:13

标签: opencl

我有一个内核,我需要多次执行(使用clEnqueueNDRangeEnqueue),并且它的参数之一是一个整数,每次执行后都需要递增。

在让每个内核执行排队之前,不是让主机分配一个递增的值(使用clSetKernelArg),而是一种纯粹的“设备端”方式来实现此目的,例如最终工作项运行后,内核本身是否会增加一个全局整数? (我还是OpenCL的新手,所以这里可能是树错了树。)

1 个答案:

答案 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的操作,但增加计数器并不是其中之一。