Как выделить динамическую память для переменной Device Pointer в C ++ CUDA - PullRequest
0 голосов
/ 24 октября 2019

все программисты. Я конвертирую существующий проект C ++ в расширенную программу CUDA. Я новичок в CUDA. Так что я учусь во время работы. Я должен выделить память для динамической переменной-члена структуры, а переменная-структура будет выделена как переменная устройства.

примерно так:

_cuda_params* dcuda_params;

cudaMalloc(&dcuda_params, sizeof(_cuda_params));

cudaMemcpy((void *)dcuda_params, (void*)cuda_params, sizeof(_cuda_params), cudaMemcpyHostToDevice);

dcuda_params->DPht = (hashtb_entry *)malloc(c);  // c is size to allocate.

Но во время выполнения я получаю исключение 0xC0000022. Я также попробовал это:

cudaMalloc(&dcuda_params->DPht, c);

но результат тот же. Как я могу справиться с этим?

.h file
    typedef struct {
        int blocksPerGrid;
        int threadsPerBlock;
        uint64_t HASH_SIZE;
        hashtb_entry* DPht;
    } _cuda_params;

.cu file

void _GpuSearch(_cuda_params* cuda_params){
...
        _cuda_params* dcuda_params;
        cudaMalloc(&dcuda_params, sizeof(_cuda_params));
        cudaMemcpy((void *)dcuda_params, (void*)cuda_params, sizeof(_cuda_params), 
        cudaMemcpyHostToDevice);
        dcuda_params->DPht = (hashtb_entry *)malloc(c); //c: size to allocate.
...
}

1 Ответ

1 голос
/ 24 октября 2019

Вы разыменовываете указатель устройства, dcuda_params->DPht = (hashtb_entry *)malloc(c);это не разрешено, поскольку хост не имеет доступа к памяти устройства.

Простое решение вашей проблемы - не использовать указатель на экземпляр вашей структуры. Вы все равно не используете его массив. Поэтому вызов функции изменится на:

void _GpuSearch(_cuda_params cuda_params)

скажем, cuda_params больше не указатель, который вы можете просто сделать:

cudaMalloc(&cuda_params.DPht , sizeof(hashtb_entry));

отныне вы можете передать cuda_params на значение для ядра. А при необходимости вы копируете с хоста на cuda_params.DPht.

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