当我尝试这个时,我在'output'得到了错误的结果,即使我将'cum'数组的值复制到输出。
但是如果我重命名代码中前面提到的'cum'数组。我得到正确的数组值。因此,我无法重用结果值。
该设备有8个内核,没有共享内存。
赞赏所有评论/建议。
kernel void histogram(global unsigned int *input,
global unsigned int *output,
global unsigned int *frequency,
global unsigned int *cum,
unsigned int N)
{
int pid = get_global_id(0);
//cumulative sum
for(int i=0; i < 16; i++)
{
cum[(i*16)+(2*pid)+1] = frequency[(i*16)+(2*pid)] + frequency[(i*16)+(2*pid)+1];
}
barrier(CLK_GLOBAL_MEM_FENCE);
for(int i=0; i < 32; i++)
{
output[(i*8)+pid] = cum[(i*8)+pid];
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
答案 0 :(得分:0)
确保您了解并行前缀和。特别是我没有看到总额或部分的降级步骤:
http://http.developer.nvidia.com/GPUGems3/gpugems3_ch39.html
我会查看您在OpenCL device memory read/write issue中使用的TI的Keystone II SDK,看看它们是否有任何扫描或并行前缀和实现或内置函数。