0

使用 CUDA,我想为不同的数组分配内存,每个 GPU 的内存来自与 main() 不同的函数,但我一定错过了指针运算方面的一些东西。这是我的想法,

void InitThisMemory(int***, int N, int Nout, size_t* pitch, int height, int width); // This function's purpose is to initialize A and the pitch

int main(void){
   int** A;
   int N = 10; 
   int NOut = 2;
   int height = 2, width = 2;
   size_t pitch;
   InitThisMemory(&A, N, NOut, &pitch, height, width);
   return 0;
}

InitThisMemory(int ***A, int N, int Nout, size_t* pitch, int height, int width){
  int i;
  *A = (int**)malloc(Nout * sizeof(int*));
  for(i = 0;i < Nout;i++){
      cudaSetDevice(i);
      cudaMallocPitch((void**)&(*A[i]), &(*pitch), width, height);
  }
}

免责声明:不是我的实际代码,但这应该会重现错误。如果我错过了某处的变量分配,请告诉我。

为什么我认为问题出在算术上?Nout = 1仅仅是因为如果(这意味着我只使用一个设备),这很好用。

有任何想法吗?

4

1 回答 1

2

我认为你的错误是写(void**)&(*A[i])而不是(void **) (&(*A)[i]),但我建议你重构如下:

  1. 使用本地 int ** 变量来保存malloc()返回值;
  2. 在您的呼叫中使用该本地cudaMallocPitch()
  3. malloc()仅当所有cudaMallocPitch()调用都成功 时才传回返回值。

如果你做了这些事情,那么在其中一个cudaMallocPitch()调用失败的情况下编写正确的清理代码会更简单,并且你不需要传播回传,除非一切都成功了。

于 2012-09-18T23:15:45.277 回答