你好我是openCL的新手,在尝试索引我的多维数组时遇到了问题。据我所知,不可能在全局内存中存储多维数组,但可以在本地内存中存储。然而,当我尝试访问我的2D本地数组时,它总是回到0.我在http://www.notebookcheck.net/NVIDIA-GeForce-GT-635M.66964.0.html查看了我的gpu并发现我有0个共享内存,这可能是原因吗?在我的编程经验中,共享内存会有什么其他限制? 我已经发布了一个我面临的问题的简单程序。 输入是= [1,2,3,4],我想将它存储在我的2D数组中。
__kernel void kernel(__global float *input, __global float *output)
{//the input is [1,2,3,4];
int size=2;//2by2 matrix
int idx = get_global_id(0);
int idy = get_global_id(1);
__local float 2Darray[2][2];
2Darray[idx][idy]=input[idx*size+idy];
output[0]=2Darray[1][1];//this always returns 0, but should return 4 on the first output no?
}
答案 0 :(得分:0)
__local float 2Darray[1][1];
是1个元素宽,1个元素高。
2Darray[1][1]
是不存在的第二行和第二列。
即使它让你拥有没有错误的本地内存,它也会溢出到全局内存并且速度与vram带宽一样慢(如果它不适合本地内存空间)。
竞争条件:
output[0]=2Darray[1][1];
每个核心都试图写入相同的(0)索引。添加
barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);
if(idx==0 && idy==0)
之前只有1个线程写入它。但在此之前仍需要同步指令。