如果我声明一个变量:
define SIZE = 900; // width and height of an image
float ** abc;
所以,如果我想在GPU上为它分配内存,我应该像这样分配吗?
cudaMalloc(&abc, SIZE * SIZE * sizeof(float));
因为我收到警告:整数运算结果超出范围。
如果我这样声明:
cudaMalloc(&abc, SIZE * sizeof(float));
然后就好了,我不知道是否有数组2维,我应该分配什么?
提前致谢。
答案 0 :(得分:7)
此代码是否会给出相同的警告?
const size_t SIZE = 900;
float *abc;
cudaMalloc((void **)&abc, SIZE * SIZE * sizeof(float));
尝试完全使用此代码,而不是类似的代码...如果这不起作用,我的猜测是存在一个严重的问题,这不是你的错。
为什么要声明abc是float的双重间接指针? malloc()和cudaMalloc()只分配连续的内存块...如果你想将abc解释为二维数组,你必须弄清楚这样做的逻辑(转换为/来自二维和线性指数)你自己。你要求nvcc做的是为float *分配3,240,000字节的内存,它只需要4个字节来存储。
答案 1 :(得分:1)
cudaMalloc不分配二维数组,你可以将一维数组转换为二维数组,或者你必须首先为float ** abc分配一维指针数组,然后为** abc中的每个指针分配float数组,如下所示:
float ***abc;
float ***h_abc = malloc(SIZE * sizeof(float*));
cudaMalloc(&abc,SIZE * sizeof(float*));
for(int i = 0 ; i < SIZE ; i++ ){
cudaMalloc(&(h_abc[i]), SIZE * sizeof(float)):
}
cudaMemcpy(&abc,h_abc,SIZE * sizeof(float*));