【问题标题】:OpenCL NDrangekernel with 3d global size and 3d local size具有 3d 全局大小和 3d 局部大小的 OpenCL NDrangekernel
【发布时间】:2017-04-11 14:32:45
【问题描述】:

我正在尝试通过识别 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

【问题讨论】:

    标签: opencl


    【解决方案1】:

    最大组大小限制了 64 * 64 * 64 部分。

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

    还有一点很重要,你最好先在网上查一些归约逻辑的实现例子。 Atomics 非常昂贵,像您所做的那样使用它们几乎肯定会使您的 GPU 代码比 CPU 代码慢。

    【讨论】:

    • 我使用的是CUDA卡,但是我的程序需要在各种显卡上运行,所以我必须使用OpenCL。您的意思是像本地减少和全局减少而不是不同域中的两个 atomic_add 对吗?我只是不想在我的内核文件中写太多的内核函数。你能推荐我的一些 OpenCL 资源吗?
    • @EdwinDebuger 我记得 AMD 的 SDK 中有示例,但我不确定。我认为对于您的情况,您可以只使用较小的块,让一个线程处理的比元素多。
    • @EdwinDebuger 更通用的解决方案是在 GPU 上进行局部缩减,而不是在 CPU 上进行全局缩减。但是在进行每组缩减之前,您仍然需要进行每线程本地本地缩减。组的最佳数量取决于 GPU 的容量而不是作业的大小。
    猜你喜欢
    • 1970-01-01
    • 2018-01-30
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多