Невозможно выделить память устройства CUDA для типа данных cufftComplex - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь выделить массив cufftComplex в память на устройстве CUDA (GEFORCE GTX 1080), используя следующий код:

cufftComplex *d_in, *d_out;
int ds = sizeof(cufftComplex) * width * height;
CUResult test_din = cuMemAlloc((void**)&d_in, ds);
CUResult test_dout = cuMemAlloc((void**)&d_out, ds);
printf("test_din:  %s\n", cudaGetErrorString(test_din));
printf("test_dout:  %s\n", cudaGetErrorString(test_dout));

Когда я запускаю этот код, я получаю сообщение об ошибке:

test_din: ошибка инициализации

test_dout: ошибка инициализации

Когда я компилирую код, я получаю предупреждение об использовании void **, но все примеры cufft, которые я видел, включая примеры кода, поставляемые с Cuda 9.1, включают приведение типа void **. Предупреждение сформулировано следующим образом:

/ usr / local / cuda / include / cuda.h: 90: 49: примечание: ожидается CUdeviceptr *, но аргумент имеет тип 'void **'

Есть ли что-то очевидное, что я здесь делаю неправильно?

1 Ответ

0 голосов
/ 03 июля 2018

cuMemAlloc из API драйвера CUDA.

Если вы изучите какие-либо подходящие программы API драйверов, вы обнаружите, что первое, что вам нужно сделать, это выдать:

cuInit();

чтобы начать использовать CUDA. Возможно, вы этого не сделали (вы должны предоставить MCVE). Это вероятная причина этой конкретной ошибки.

Вы столкнетесь с другими разъединениями между API драйвера CUDA и API времени выполнения CUDA, если смешаете их. Это не должно быть необходимо для большинства кодов, и я не рекомендую его для начинающих.

Изучите примеры кодов, чтобы узнать, как использовать один или другой. Например, изучите пример кода vectorAdd , чтобы изучить основы программы CUDA runtime API . Изучите соответствующую vectorAddDrv , чтобы изучить основы программы API-интерфейса CUDA .

Самым простым решением здесь, вероятно, является просто замена вызовов на cuMemAlloc на cudaMalloc:

cufftComplex *d_in, *d_out;
int ds = sizeof(cufftComplex) * width * height;
cudaError_t test_din = cudaMalloc((void**)&d_in, ds);
cudaError_t test_dout = cudaMalloc((void**)&d_out, ds);
printf("test_din:  %s\n", cudaGetErrorString(test_din));
printf("test_dout:  %s\n", cudaGetErrorString(test_dout));
...