嗨,我收到了访问冲突错误.....
我的代码中可能出现什么问题? 当我将W和H改为10时,它可以正常工作。
#define W 100
#define H 100
#define MAX 100000
int** GetImage()
{
int **img = new int*[W];
for(size_t i = 0 ; i < W ; i++ )
img[i] = new int[H];
for(int i=0;i<W;i++)
for(int j=0;j<H;j++)
img[i][j]=255;
return img;
}
int main()
{
int **image = GetImage();
float **dtr = initDistances(image);
//cuda memory allocation
int **devImage;
float **devDt;
int sizei = W*H*sizeof(int);
int sizef = W*H*sizeof(float);
cudaMalloc((void**)&devImage, sizei);
cudaMalloc((void**)&devDt, sizef);
//copy to GPU
cudaMemcpy(devImage, image, sizei, cudaMemcpyHostToDevice); <-- access violation here
cudaMemcpy(devDt, dtr, sizef, cudaMemcpyHostToDevice);
return 0;
}
答案 0 :(得分:1)
“image”是指向“W”指针数组的指针,每个指针指向“H”整数的列向量。那只是W * sizeof(int *)字节,即比“sizei”小得多。
对cudaMemcpy()的调用假定图像存储为一个连续的W * H整数块。但是,这不是它在主机上的存储方式。如果可能的话,我建议将主机分配更改为连续的存储方案。
答案 1 :(得分:0)
你的数组在内存中不是连续的,但是你试图将其复制,就像它一样。
要分配连续数组,您需要进行单个分配。但是你要分配一个指针数组,然后为每个指针分配一个整数数组,所以不能保证img [0]紧跟在内存中的img [1]之前。 img [0]和img [1]分别分配。他们可能在记忆中完全不同的地方。
你的cudaMemcpy假设img [0] -img [W]是一个很大的连续块。