cudaMemcpy2D 错误与大数组
cudaMemcpy2D error with large array
我尝试使用cudaMallocPitch
和cudaMemcpy2D
,但是当我尝试将cudaMemcpy2D
与大数组一起使用时,我遇到了一个问题:
分段错误
这是可运行的源代码,没有错误。
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include <random>
#define ROW_SIZE 32
#define COL_SIZE 1024
int main()
{
float ** pfTest;
pfTest = (float**)malloc(ROW_SIZE * sizeof(float*));
for (int i = 0; i < ROW_SIZE; i++) {
pfTest[i] = (float*)malloc(COL_SIZE * sizeof(float));
}
std::default_random_engine generator;
std::uniform_real_distribution<float> distribution;
for (int y = 0; y < ROW_SIZE; y++) {
for (int x = 0; x < COL_SIZE; x++) {
pfTest[y][x] = distribution(generator);
}
}
float *dev_Test;
size_t pitch;
cudaMallocPitch(&dev_Test, &pitch, COL_SIZE * sizeof(float), ROW_SIZE);
cudaMemcpy2D(dev_Test, pitch, pfTest, COL_SIZE * sizeof(float), COL_SIZE * sizeof(float), ROW_SIZE, cudaMemcpyHostToDevice);
printf("%sn", cudaGetErrorString(cudaGetLastError()));
return 0;
}
如您所见,完全没有问题。但是,当我尝试将COL_SIZE
扩展到大约 500,000
(确切地说,524288)时,它因分段错误而崩溃。
关于问题的根源有什么帮助吗?
cudaMemcpy2D
只能用于复制倾斜的线性存储器。您的源数组不是倾斜的线性存储器,它是一个指针数组。这不受支持,并且是段错误的根源。
尝试这样的事情:
float* buffer;
float** pfTest;
const size_t buffer_pitch = size_t(COL_SIZE) * sizeof(float);
buffer = (float*)malloc(size_t(ROW_SIZE) * buffer_pitch);
pfTest = (float**)malloc(ROW_SIZE * sizeof(float*));
for (size_t i = 0; i < ROW_SIZE; i++) {
pfTest[i] = buffer + i * size_t(COL_SIZE);
}
// ...
cudaMallocPitch(&dev_Test, &pitch, buffer_pitch, ROW_SIZE);
cudaMemcpy2D(dev_Test, pitch, buffer, buffer_pitch,
buffer_pitch, ROW_SIZE, cudaMemcpyHostToDevice);
[注:用浏览器编写,从未测试或编译,使用风险自负]
即将要复制的数据存储在单个连续内存分配中,该分配可以充当cudaMemcpy2D的倾斜线性源。如果您坚持在主机上使用[][]
样式索引,那么您必须付出代价,即在数据旁边存储额外的指针数组。请注意,这实际上不是必需的,您可以直接索引到buffer
并实现相同的结果,同时节省内存。
相关文章:
- 类动态数组错误
- 如何返回多维数组?错误C2440
- 数组错误(不允许类型不完整)
- C++ 将文件读取到数组错误:'operator>>'不匹配
- 不断增加的指针数组 错误:赋值中的类型不兼容
- 从文本文件读取 2D 数组错误
- 动态结构数组错误
- 旋转数组 - 错误
- 按字母顺序排序名称,数组错误
- 因为每个循环都读取数组错误
- 二维数组错误
- C 获取数组错误
- 编译时出现字符串数组错误
- c++2维指针类数组错误(使用openframework)
- C++数组错误
- C++上数组错误的大小
- C++数组错误:访问冲突读取位置0xC0000005
- c++2D数组错误
- C++:为“char [4]”数组错误获取太多初始值设定项
- 分段错误(核心转储)排序字符串数组错误