【发布时间】:2014-03-10 17:44:21
【问题描述】:
这是一个看似基本的问题,我通过大量的反复试验无法解决。我有一个内核,它使用两个全局 r/w 缓冲区和一个本地 - 它从第一个缓冲区获取输入,使用第二个缓冲区对其进行伪排序以进行临时存储,并最终将其复制回第一个缓冲区一定的顺序。 (剥离)代码如下:
struct PACKET_POINTER {
int packetIndex;
int currentCell;
};
#define RPC_DIV_BUCKET 100
__kernel void PseudoSort(__global struct PACKET_POINTER * in,__global struct PACKET_POINTER * out, __local struct PACKET_POINTER * aux) {
int i = get_local_id(0);
int wg = get_local_size(0);
int gid = get_global_id(0);
int offset = get_group_id(0) * wg;
aux[i] = in[i+offset];
barrier(CLK_LOCAL_MEM_FENCE);
//-----
//Irrelevant code block here
//-----
out[(gid%1024)*RPC_DIV_BUCKET + (gid/1024)] = aux[i];
}
在父 C 程序中检索“out”缓冲区的内容没有问题。但是,当我将以下几行添加到内核时:
barrier(CLK_GLOBAL_MEM_FENCE);
in[gid] = out[gid];
并尝试读取“in”缓冲区,它在第一次执行时主要出现垃圾值,但如果 .exe 在没有修改的情况下第二次运行,它将获得预期的数据。我在内核调用和缓冲区读取之间有一个 clFinish(commands) 调用,因此它应该在任何读取尝试之前运行完成。我在这里遗漏了一些明显的东西?提前感谢您的帮助 - 如果我在那之前遇到它会发布解决方案。
【问题讨论】:
-
创建缓冲区时使用了哪些标志?
-
CL_MEM_READ_WRITE 用于两者。
标签: memory opencl global read-write