gpt4 book ai didi

c++ - 二维数组的 cudamalloc

转载 作者:行者123 更新时间:2023-11-28 06:19:06 25 4
gpt4 key购买 nike

我正在尝试将二维矩阵从主机复制到设备。这是我写的

    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);

矩阵 是二维 uint16_t vector (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 需要一个单指针 (*),而您传递的是一个双指针 (**)。

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

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

并使用索引算法进行二维访问。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com