使用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
(这意味着我只使用一个设备),这非常有效。
有什么想法吗?
答案 0 :(得分:2)
我认为您的错误是写(void**)&(*A[i])
而不是(void **) (&(*A)[i])
,但我建议您重构如下:
malloc()
返回值; cudaMallocPitch()
的通话中使用本地号码; malloc()
次调用都成功时,cudaMallocPitch()
返回值。 如果你做了这些事情,那么在其中一个cudaMallocPitch()
调用失败的情况下编写正确的清理代码会更简单,除非一切都成功,否则你不需要传播回传。