通过另一个函数进行多gpu分配

时间:2012-09-18 19:45:39

标签: pointers cuda

使用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(这意味着我只使用一个设备),这非常有效。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

  1. 使用local int **变量来保存malloc()返回值;
  2. cudaMallocPitch()的通话中使用本地号码;
  3. 仅当所有malloc()次调用都成功时,
  4. 才会传回cudaMallocPitch()返回值。
  5. 如果你做了这些事情,那么在其中一个cudaMallocPitch()调用失败的情况下编写正确的清理代码会更简单,除非一切都成功,否则你不需要传播回传。