Я написал метод, который вызывается из файла.cpp для запуска cudaMemcpy. Метод приведен ниже:
void copy_to_device(uint32_t *host, uint32_t *device, int size)
{
cudaError_t ret;
ret = cudaMemcpy(device, host, size*sizeof(uint32_t), cudaMemcpyHostToDevice);
if(ret == cudaErrorInvalidValue)
printf("1!\n");
else if(ret == cudaErrorInvalidDevicePointer)
printf("2!\n");
else if(ret == cudaErrorInvalidMemcpyDirection)
printf("3!\n");
}
мой.cpp файл вызывает это следующим образом:
uint32_t *input_device;
device_malloc(input_device, INPUT_HEIGHT*INPUT_WIDTH);
uint32_t *oneDinput = TwoDtoOneD(input, INPUT_HEIGHT, INPUT_WIDTH);
copy_to_device(oneDinput, input_device, INPUT_HEIGHT*INPUT_WIDTH);
Все, что делает TwoDtoOneD, - это взять в 2D-массив и преобразовать его в 1D-массив и вернуть его. Всякий раз, когда я пытаюсь использовать метод copy_to_device
, он возвращает cudaErrorInvalidValue, который плохо документирован на веб-сайте NVIDIA. Вы, ребята, знаете, что не так с параметрами, которые я передаю своей функции, которая вызывает эту ошибку? Это вызывает проблемы во время выполнения ядра. Если вам нужна дополнительная информация, пожалуйста, спросите.
Здесь метод device_malloc
:
void device_malloc(uint32_t *buffer, int size)
{
cudaMalloc((void **) &buffer, size*sizeof(uint32_t));
}
Проблема здесь:
uint32_t *input_device;
device_malloc(input_device, INPUT_HEIGHT*INPUT_WIDTH);
Независимо от device_malloc
, что делает device_malloc
, он не изменяет значение input_device
. То есть, если первый аргумент не является ссылкой на указатель, но я готов поспорить, что это не так.
Вам нужно изменить первый аргумент device_malloc
на указатель на указатель и вызвать его так:
device_malloc(&input_device, INPUT_HEIGHT*INPUT_WIDTH);
Или просто device_malloc
вернет указатель на выделенную память.
Чтобы ответить на ваш вопрос более подробно, cudaMemcpy
возвращает ошибку, потому что его первый аргумент, device
, не является допустимым указателем на устройство, у которого время выполнения CUDA имеет способ проверки. Вероятно, он имеет ценность для мусора, поскольку вы никогда не инициализируете его из-за вышеупомянутой проблемы.
В качестве побочного примечания и не связанного с этой проблемой, вы можете использовать cudaGetErrorString
для более удобного способа распечатать статус.
device_malloc
в свой оригинальный пост. Я дать ему ссылку на этот указатель в первом аргументе cudaMalloc
. Это то, что вы имели в виду?
buffer
cudaMalloc
, не присваивается input_device
в вызывающем коде.