Cuda 2D распределение памяти и проблема копирования - PullRequest
0 голосов
/ 21 января 2011
   int **F;
   int **dev_pF;
   size_t *pitchF;
   void init_cuda_mem(int mF,int mT,int nF,int nT){

    cudaMallocPitch((void **)dev_pF,pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2);
    cudaMemcpy2D((void *)dev_pF,*pitchF,(void *)pF,*pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2,cudaMemcpyHostToDevice);
   }

Ну привет всем

в приведенном выше фрагменте я пытаюсь выделить 2D-массив с помощью cudaMallocPitch

и затем копирование этого массива с помощью cudaMemcpy2D с хоста на устройство

к сожалению, он падает, и я думаю, что ошибка (я думаю) в cudaMemcpy2D

Может кто-нибудь помочь мне найти его, пожалуйста

1 Ответ

0 голосов
/ 21 января 2011

Думаю, проблема в том, что вы ошибаетесь в отношении указателей и указателей на указатели.

Вы, вероятно, должны сделать что-то вроде:

int *dev_pF;
size_t pitchF;

void init_cuda_mem(int mF,int mT,int nF,int nT) {
    cudaMallocPitch((void **)&dev_pF, &pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2);
    cudaMemcpy2D((void *)dev_pF,pitchF,(void *)pF, pitchF,(nF + 2*nT -2)*sizeof(int),mF + 2*mT -2,cudaMemcpyHostToDevice);
}

Обратите внимание на то, что вы теперь берете адрес переменных в вызове cudaMallocPitch, а затем просто используете их непосредственно во втором вызове.

В исходном коде вы сначала просили cudaMalloc сохранить указатель в той памяти, на которую указывает dec_pF, и сохранить размер в той памяти, на которую указывал pitchF. И то, и другое объединено, поэтому там может произойти катастрофа. Во втором вызове вы конвертировали dev_pF из указателя в указатель на обычный указатель, поэтому вы говорите memcpy копировать память, начиная с того места, где хранился указатель, а не с того места, где была выделена память. И поскольку указатель на указатель и размер вначале унифицированы, может произойти практически все.

Кроме того, вы используете указатель pF, которого я не вижу в исходном коде, убедитесь, что он правильно инициализирован.

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