我正在尝试将2D矩阵从主机复制到设备。我写了这个

    int dev=0;
    cudaSetDevice(dev);

    uint16_t * dev_matrix;
    size_t pitch;
    cudaMallocPitch(&dev_matrix,&pitch, 1024*sizeof(uint16_t), 65536);
    cudaMemcpy2D(dev_matrix, pitch, matrix, 1024*sizeof(uint16_t),  1024*sizeof(uint16_t), 65536, cudaMemcpyHostToDevice);
    //kernel function to implement
    cudaFree(dev_matrix);
    free (matrix);


matrix是2D uint16_t矢量(1024x65536)。这段代码返回了细分错误,我不明白为什么

最佳答案

不能将其用作单个cudaMemcpy操作的源:

uint16_t **matrix = new uint16_t*[1024];
for(int h = 0; h < 1024; ++h) matrix[h] = new uint16_t[65536];


主机代码中对new的每次调用都会创建一个单独的分配,并且不能保证它们是连续的或相邻的。因此,我们不能将单个指针传递给cudaMemcpy2D并期望它能够发现所有分配的位置。 cudaMemcpy2D期望单个连续分配。

请注意,cudaMemcpy2D需要一个单指针(*),而您正在传递一个双指针(**)。

最简单的解决方案是像这样将您的matrix展平:

uint16_t *matrix = new uint16_t[1024*65536];


并将索引算法用于2D访问。

关于c++ - 二维数组的cudamalloc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29610705/

10-11 19:31