Parallel processing OpenCL同步全局内存

Parallel processing OpenCL同步全局内存,parallel-processing,opencl,gpu,gpgpu,Parallel Processing,Opencl,Gpu,Gpgpu,我有一个内核,它有3个阶段。每个阶段都必须在执行跳转到下一个阶段之前完成。我不知道怎么做,或者是否使用了CLK\u GLOBAL\u MEM\u FENCE。(我在水蚀内核上得到了非常奇怪的结果) 说明我的问题的伪代码: void kernel krnl(__global float* data __global float* avg) { int2 pos = (int2)(get_global_id(0), get_global_id(1));

我有一个内核,它有3个阶段。每个阶段都必须在执行跳转到下一个阶段之前完成。我不知道怎么做,或者是否使用了
CLK\u GLOBAL\u MEM\u 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;
};
首先,它应该用“随机”数填充缓冲区,然后将一个值与其相邻值混合


那么,进行这种同步的可能性是什么呢?是否可以在一个内核中使用所需的缓冲区,或者我必须添加
in
out
缓冲区,而不仅仅是读写?还是创建多个内核和共享缓冲区更好?

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


因此,您需要使用多个内核来实现这类功能。或者,您可能会考虑是否可以实现您的算法,以便只需要在给定工作组中同步内存,您可以使用<代码>屏障>代码>函数。

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


因此,您需要使用多个内核来实现这类功能。或者,您可能会考虑是否可以实现您的算法,以便只需要在给定工作组中同步内存,您可以使用<代码>屏障>代码>函数。

同意。对此最简单的解释方法是认识到并非所有的工作项都一起运行,有时它们是成批运行的。同意。对此进行推理的最简单方法是认识到并非所有工作项都一起运行,有时它们是成批运行的。