Инициализируйте неподписанный символ, используя cudaMemcpy - PullRequest
0 голосов
/ 07 октября 2019

Я выделил память для массива беззнаковых символов с помощью cudaMalloc и инициализировал с помощью cudaMemset.

unsigned char *device_channel_data;
cudaMalloc( device_channel_data, sizeof(unsigned char) * image_size);
cudaMemset( *device_channel_data, 0, sizeof(unsigned char) * image_size);

После этого я проверяю, действительно ли он установлен в 0, копируя данные обратно на хост,Я печатаю некоторые элементы для проверки данных, но напечатанные значения являются случайными.

unsigned char *host_channel_channel;
cudaMemcpy(host_channel_channel, device_channel_data, sizeof(unsigned char) * image_size, cudaMemcpyDeviceToHost);

    for(int i = 0; i < 10; i ++)
    {
        std::cout<< (int)host_channel_channel[i] << std::endl;
    }

Я хочу инициализировать данные device_channel равными 0. Мои знания в области указателей и программирования на CUDA очень ограничены. Я только начинаю с программирования CUDA. Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 08 октября 2019

Ответ на ваш вопрос находится в документации CUDA: https://docs.nvidia.com/cuda/cuda-runtime-api/group__CUDART__MEMORY.html

Для обработки ошибок ( Использование cudamalloc (). Почему двойной указатель? )CUDA-API нужен указатель на указатель в качестве входного параметра для выделения памяти, в то время как для memset необходим простой указатель. Измените свой код на:

unsigned char *device_channel_data;
cudaMalloc( (void**)&device_channel_data, sizeof(unsigned char) * image_size);
cudaMemset( device_channel_data, 0, sizeof(unsigned char) * image_size);

и все должно работать нормально.

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