cudaMemCpy, возвращающий cudaInvalidData

0

Я написал метод, который вызывается из файла.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)); 
}
  • 0
    @Tae-SungShin Tae-SungShin Я не ненавижу, но в моем коде cuda я #include <stdint.h>, который определяет uint32_t.
Теги:
cuda
memcpy

1 ответ

2
Лучший ответ

Проблема здесь:

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 для более удобного способа распечатать статус.

  • 0
    Спасибо за вашу помощь! Я добавил определение метода device_malloc в свой оригинальный пост. Я дать ему ссылку на этот указатель в первом аргументе cudaMalloc . Это то, что вы имели в виду?
  • 1
    Это не ссылка на указатель; это сам указатель. Значение, назначенное для buffer cudaMalloc , не присваивается input_device в вызывающем коде.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню