我有一个有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;
};
首先它应该用"随机"填充缓冲区。数字,然后将值与其邻居混合。
那么,进行这种同步的可能性有多大?是否可以在一个内核中完成,只需要缓冲区,或者我必须添加in
和out
个缓冲区,而不仅仅是read_write?或者创建多个内核和共享缓冲区是否更好?
答案 0 :(得分:4)
OpenCL没有提供在执行内核的所有工作组之间同步全局内存的任何方法。这是因为OpenCL被设计为在大量不同的设备上运行,并非所有这些设备都可以保证任意大型内核调用中的所有工作组将同时运行(并相互之间进行独立的前向进展)
因此,您需要使用多个内核来实现此类事情。或者,您可以考虑是否可以实现算法,这样您只需要在给定工作组内同步内存,您可以使用barrier
函数执行此操作。