【发布时间】: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;
};
首先它应该用“随机”数字填充缓冲区,然后将一个值与其邻居混合。
那么,进行这种同步的可能性有哪些?是否可以在一个内核中只使用必要的缓冲区,或者我必须添加 in 和 out 缓冲区,而不仅仅是 read_write?还是创建多个内核和共享缓冲区更好?
【问题讨论】:
标签: parallel-processing opencl gpu gpgpu