2011-01-21 57 views
0
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); 
    } 

好大家好Cuda的2D内存分配和复制问题

在上面的代码片段我试图分配使用使用cudaMallocPitch

一个二维数组,然后复制使用cudaMemcpy2D从主机到数组设备

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

有人可以帮我找到它请

回答

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碰巧指向的任何内存中,并将大小存储在指向的任何内存中。这些都是单元化的,所以灾难可能发生在那里。在第二个叫你从一个指针转换dev_pF的指针有规律的指针,所以你告诉的memcpy复制内存开始在指针储存而不是储存分配的内存位置。既然指向指针的指针和起初单元化的大小,几乎可以发生任何事情。

而且,你正在使用pF的指针,我不能在原来的代码中看到的,确保它是正确的初始化。

+0

谢谢!你是对的我错过了。 – Spyros 2011-01-21 10:49:48