访问冲突异常

时间:2011-06-03 17:50:51

标签: cuda

嗨,我收到了访问冲突错误.....

我的代码中可能出现什么问题? 当我将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;
}

2 个答案:

答案 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]是一个很大的连续块。