Исключение нарушения доступа - PullRequest
0 голосов
/ 03 июня 2011

Привет, я получаю сообщение об ошибке доступа .....

В чем может быть проблема в моем коде ??Когда я изменяю 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 ]

1 голос
/ 03 июня 2011

«изображение» - это указатель на массив указателей «W», каждый из которых указывает на вектор столбцов целых чисел «H».Это только W * sizeof (int *) байтов, т.е. намного меньше, чем "sizei".

При вызове cudaMemcpy () предполагается, что изображение хранится как один непрерывный кусок целых W * H.Однако это не так, как он хранится на хосте.Я бы порекомендовал изменить выделение хоста на непрерывную схему хранения, если это возможно.

0 голосов
/ 03 июня 2011

Ваш массив не является непрерывным в памяти, но вы пытаетесь скопировать его, как если бы он был.

Чтобы выделить непрерывный массив, вам нужно сделать одно выделение.Но вы выделяете массив указателей, а затем выделяете массив целых чисел для каждого из этих указателей, поэтому нет гарантии, что img [0] непосредственно предшествует img [1] в памяти.img [0] и img [1] были выделены отдельно.Они могут находиться в совершенно разных местах памяти.

Ваш cudaMemcpy предполагает, что img [0] -img [W] - это один большой непрерывный блок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...