具有3d全局大小和3d本地大小的OpenCL NDrangekernel

时间:2017-04-10 22:09:43

标签: opencl

我试图通过识别3d体积位置和组ID来计算每个组的局部总和。

我的想法是将空间划分为组并使用atomic_add来计算local_sum。 但是因为我是并行计算的新手,所以很难找到代码和指令之间的相关性。 我当前的内核就像:

__kernel void TestAtomicAddLocal(__global *int src, int3 size, __global int *res)
{
    int x = get_global_id(0);
    int y = get_global_id(1);
    int z = get_global_id(2);
    if( x >= vol_dim.x || y >= vol_dim.y || z >= vol_dim.z ){ return; }
    int id = x + y * vol_dim.x + z * vol_dim.x * vol_dim.y; 

   // local mem shared by all work items in work group, 
   //so this can be accessed by all items in current workgroup 
    __local int local_sum;
    local_sum= 0;

    // use global_id to access the value of input array
    int local_offset = atomic_add(&local_sum, src[id]);
    barrier(CLK_LOCAL_MEM_FENCE);

    int global_offset = atomic_add(&num_verts[0], local_sum);
    barrier(CLK_GLOBAL_MEM_FENCE);
}

对于主机部分,我的设置是

enqueueNDrangeKernel( cq, kn_testAtomicAddLocal, 3, 0, cl::size3(256,256,256), cl::size3(64, 64, 64), 0, 0, 0);

对于kenrnel参数,* src为cl_mem,大小为256*256*256*sizeof(cl_int),大小为4 * sizeof(cl_int),* res为cl_mem,大小为4*sizeof(int)。 然后我得到CL_OUT_OF_RESOURCE和CL_INVALID_GROUP_SIZE的错误,根据我的理解,我的设备最大组大小是1024,但是这里总组=(256/64)^ 3 = 64< 1024。 我的gpu max工作项目大小是1024x1024x64,这也没关系。所以我认为必须有一些我理解的错误。我希望有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

最大组大小限制您的64 * 64 * 64部分。

我猜你正在使用CUDA卡。你最好在CUDA卡上使用CUDA。 OpenCL或多或少地在CUDA卡上模拟。如果你不是,我认为所有AMD卡的组大小限制为256.编辑:嗯......我忘记了英特尔的。如果是这样,请忽略此部分。

更重要的是,您最好先在互联网上查看一些简化逻辑实现示例。原子是非常有用的,像你所做的那样使用它们几乎可以确保你的GPU代码比CPU代码慢。

相关问题