Cuda 2D内存分配和复制问题

时间:2011-01-21 10:24:23

标签: c memory-management cuda

   int **F;
   int **dev_pF;
   size_t *pitchF;
   void init_cuda_mem(int mF,int mT,int nF,int nT){

    cudaMallocPitch((void **)dev_pF,pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2);
    cudaMemcpy2D((void *)dev_pF,*pitchF,(void *)pF,*pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2,cudaMemcpyHostToDevice);
   }

大家好,

在上面的代码片段中,我正在尝试使用cudaMallocPitch分配2D数组

然后使用cudaMemcpy2D将该数组从主机复制到设备

不幸的是它崩溃了,我认为错误是(我认为)在cudaMemcpy2D

有人可以帮我找到它

1 个答案:

答案 0 :(得分:0)

我认为问题在于你对指针和指针指针的误解。

你应该做的事情是:

int *dev_pF;
size_t pitchF;

void init_cuda_mem(int mF,int mT,int nF,int nT) {
    cudaMallocPitch((void **)&dev_pF, &pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2);
    cudaMemcpy2D((void *)dev_pF,pitchF,(void *)pF, pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2,cudaMemcpyHostToDevice);
}

请注意,您现在正在使用cudaMallocPitch调用中的变量地址,然后在第二次调用中直接使用它们。

在您的原始代码中,您首先要求cudaMalloc将指针存储在指向dec_pF的任何内存中,并将该大小存储在pitchF指向的内存中。这两个都是集体化的,所以灾难可能发生在那里。在第二个调用中,您将dev_pF从指针转换为指向常规指针的指针,因此您要告诉memcpy从存储指针的位置开始复制内存,而不是存储已分配内存的位置。既然指向指针的指针和最初整体化的大小,几乎任何事情都可能发生。

此外,您正在使用我在原始代码中看不到的pF指针,请确保它已正确初始化。