用cudaMalloc分配内存

时间:2011-10-04 13:20:37

标签: cuda

如果我声明一个变量:

define SIZE = 900; // width and height of an image

float ** abc;

所以,如果我想在GPU上为它分配内存,我应该像这样分配吗?

cudaMalloc(&abc, SIZE * SIZE * sizeof(float));

因为我收到警告:整数运算结果超出范围。

如果我这样声明:

cudaMalloc(&abc, SIZE * sizeof(float));

然后就好了,我不知道是否有数组2维,我应该分配什么?

提前致谢。

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*));