【问题标题】:OpenCL syncing global memoryOpenCL 同步全局内存
【发布时间】:2014-07-21 08:37:59
【问题描述】:

我有一个包含 3 个阶段的内核。每个阶段都必须在执行跳转到下一个阶段之前完成。我不知道该怎么做,或者CLK_GLOBAL_MEM_FENCE 是否用于此目的。 (我在水蚀内核上得到了非常奇怪的结果)。

说明我的问题的伪代码:

void kernel krnl(__global float* data
                 __global float* avg)
{
    int2 pos = (int2)(get_global_id(0), get_global_id(1));

    pos.x = max(pos.x, 1);
    pos.y = max(pos.y, 1);

    data[pos.x + get_global_size(0)*pos.y] = (pos.y+pos.x)/2.0f; //just some random stuff here

    //globalSync();

    avg[pos.x + get_global_size(0)*pos.y] = data[pos.x + 1 + get_global_size(0)*pos.y];
    avg[pos.x + get_global_size(0)*pos.y] += data[pos.x - 1 + get_global_size(0)*pos.y];
    avg[pos.x + get_global_size(0)*pos.y] += data[pos.x     + get_global_size(0)*(pos.y-1)];
    avg[pos.x + get_global_size(0)*pos.y] += data[pos.x     + get_global_size(0)*(pos.y+1)];
    avg[pos.x + get_global_size(0)*pos.y]/=4.0f;
};

首先它应该用“随机”数字填充缓冲区,然后将一个值与其邻居混合。

那么,进行这种同步的可能性有哪些?是否可以在一个内核中只使用必要的缓冲区,或者我必须添加 inout 缓冲区,而不仅仅是 read_write?还是创建多个内核和共享缓冲区更好?

【问题讨论】:

    标签: parallel-processing opencl gpu gpgpu


    【解决方案1】:

    OpenCL 不提供在执行内核的所有工作组之间同步全局内存的任何方法。这是因为 OpenCL 被设计为在大量不同的设备上运行,并且并非所有这些设备都可以保证任意大型内核调用中的所有工作组都将同时运行(并相互独立地向前推进) .

    因此,您需要使用多个内核来实现这类事情。或者,您可以考虑是否可以实现您的算法,这样您只需要在给定的工作组内同步内存,您可以使用barrier 函数来完成。

    【讨论】:

    • 同意。对此进行推理的最简单方法是意识到并非所有工作项都一起运行,有时它们会分批运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多