我有一个OpenCL内核,它在全局配置[1024x1024]中运行,不与工作组一起工作(它是一个简单的颜色分割内核)。
我在那里放置了一个barrier(CLK_GLOBAL_MEM_FENCE)
同步,以便等待[1024x1024]配置中的所有线程都到达它。但遗憾的是,它似乎不起作用。
你不能告诉我,我做错了什么吗?
typedef float dtype;
// Splits color channels in-place
__kernel void nhwc_to_nchw(__global dtype* pic_data, __global dtype* buffer,
const int n_pics, const int n_chans)
{
size_t pic_h = get_global_size(0);
size_t pic_w = get_global_size(1);
size_t pic_y = get_global_id(0);
size_t pic_x = get_global_id(1);
size_t nhwc_index;
size_t nchw_index;
size_t pic_index;
// printf("%i %i %zu %zun", n_pics, n_chans, pic_h, pic_w);
for(int n = 0; n < n_pics; n++) {
// Writting the splitted channels from one pic to buffer
pic_index = n * n_chans * pic_w * pic_h;
for(int chan = 0; chan < n_chans; chan++) {
nhwc_index = pic_y * pic_w * n_chans + pic_x * n_chans + chan;
nchw_index = chan * pic_h * pic_w + pic_y * pic_w + pic_x;
// printf("%fn", pic_data[pic_index + nhwc_index]);
buffer[nchw_index] = pic_data[pic_index + nhwc_index];
}
barrier(CLK_GLOBAL_MEM_FENCE);
//Reading splitted channels from buffer and placing them to source pic
for(int chan = 0; chan < n_chans; chan++) {
nchw_index = chan * pic_h * pic_w + pic_y * pic_w + pic_x;
pic_data[pic_index + nchw_index] = buffer[nchw_index];
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
}
CLK_GLOBAL_MEM_FENCE:
- 同步工作组内的全局读/写
CLK_LOCAL_MEM_FENCE:
- 同步工作组内的本地读/写
您真正想要的是在内核中同步全局读/写。这在OpenCL中是不可能的(在任何GPU编程语言中也是如此)。如果您的内核可以放在一个工作组中,那么它也可以,但我真的怀疑1M WI是否可以放在单个组中。
如果需要这种行为,最合适和可移植的方法是将内核拆分为两个内核