openCL中没有共享内存的多维数组?

时间:2016-03-25 23:29:44

标签: multidimensional-array opencl

你好我是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?
     }

1 个答案:

答案 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个线程写入它。但在此之前仍需要同步指令。