二维数组的 cudamalloc
cudamalloc of 2D array
我正在尝试将 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
是二维 uint16_t
向量 (1024x65536)。这段代码returns我段错误,我不明白为什么
这不能用作单个 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 矩阵从主机复制到设备。这是我写的
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
是二维 uint16_t
向量 (1024x65536)。这段代码returns我段错误,我不明白为什么
这不能用作单个 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];
并使用索引算法进行二维访问。