没有共享内存的openCL中的多维数组?
Multidimensional array in openCL with no shared memory?
你好,我是 openCL 的新手,在尝试索引我的多维数组时遇到了问题。据我了解,不可能将多维数组存储在全局内存中,但可以在本地内存中存储。但是,当我尝试访问我的 2D 本地数组时,它总是返回,因为 0.I 在 http://www.notebookcheck.net/NVIDIA-GeForce-GT-635M.66964.0.html 查看了我的 gpu 并发现我有 0 个共享内存,这可能是原因吗? 0 共享内存还会给我的编程体验带来哪些其他限制?
我已经发布了一个关于我面临的问题的简单小程序。
输入是 = [1,2,3,4],我想将其存储在我的二维数组中。
__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?
}
__local float 2Darray[1][1];
是 1 个元素宽,1 个元素高。
2Darray[1][1]
是不存在的第二行第二列。
即使它让您拥有本地内存而没有错误,它也会溢出到全局内存并变得与 vram 带宽一样慢(如果它不适合本地内存 space)。
竞争条件:
output[0]=2Darray[1][1];
每个核心都试图写入相同的 (0) 索引。添加
barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);
if(idx==0 && idy==0)
在它之前,所以只有 1 个线程写入它。不过这之前还需要同步指令。
你好,我是 openCL 的新手,在尝试索引我的多维数组时遇到了问题。据我了解,不可能将多维数组存储在全局内存中,但可以在本地内存中存储。但是,当我尝试访问我的 2D 本地数组时,它总是返回,因为 0.I 在 http://www.notebookcheck.net/NVIDIA-GeForce-GT-635M.66964.0.html 查看了我的 gpu 并发现我有 0 个共享内存,这可能是原因吗? 0 共享内存还会给我的编程体验带来哪些其他限制? 我已经发布了一个关于我面临的问题的简单小程序。 输入是 = [1,2,3,4],我想将其存储在我的二维数组中。
__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?
}
__local float 2Darray[1][1];
是 1 个元素宽,1 个元素高。
2Darray[1][1]
是不存在的第二行第二列。
即使它让您拥有本地内存而没有错误,它也会溢出到全局内存并变得与 vram 带宽一样慢(如果它不适合本地内存 space)。
竞争条件:
output[0]=2Darray[1][1];
每个核心都试图写入相同的 (0) 索引。添加
barrier(CLK_LOCAL_MEM_FENCE | CLK_GLOBAL_MEM_FENCE);
if(idx==0 && idy==0)
在它之前,所以只有 1 个线程写入它。不过这之前还需要同步指令。