Что заставляет cuLaunchKernel терпеть неудачу с CUDA_ERROR_INVALID_HANDLE?

Я запускаю скомпилированное ядро ​​CUDA, используя cudLaunchKernel()функция API драйвера. Я передаю свои параметры вkernelParams массив и передача nullptr для extra аргумент.

К сожалению, это не удается с ошибкой: CUDA_ERROR_INVALID_HANDLE. Почему? Я проверил документацию Driver API, чтобы увидеть, как функция может выйти из строя в каких случаях, и отредактировал ее, обсуждая сбой с помощьюCUDA_ERROR_INVALID_VALUE(не одно и то же). Это не обсуждает ошибку, которую я получаю.

Поскольку существует более одного параметра для cuLaunchKernel()какая-то ручка - что означает этот сбой? (А если вариантов несколько - какие?)

3 ответа

Одна из возможностей - сбой из-за переключения контекста драйвера CUDA. Возможно, вы случайно выполнили какое-то действие, которое подталкивает или заменяет текущий контекст для устройства CUDA; и загруженные модули являются частью контекста, поэтому ваше скомпилированное и загруженное ядро ​​больше не может быть загружено в текущем контексте. Это вызываетCUDA_ERROR_INVALID_HANDLE неудача.

Предполагая, что это так, переключите контекст перед запуском, например, таким образом:

cuCtxPushCurrent(my_driver_context);
cuLaunchKernel(/*etc. etc. */);
/* possibly */ cuCtxPopCurrent(NULL);

или так:

cuCtxSetCurrent(my_driver_context);
cuLaunchKernel(/*etc. etc. */);

Обратите внимание, что вы можете рисковать утечкой памяти, если вы откроете и проигнорируете единственную ссылку на действительный контекст; и вы также можете рискнуть другим кодом, предполагая, что контекст, который он создал, все еще активен.

cuobjdump -symbols myModule.cubin, чтобы проверить, было ли изменено имя вашей функции, если да, то добавьте extern «C» перед функцией вашего устройства.

Что ж, в моем случае это была ошибка OOM (недостаточно памяти), о которой по какой-то причине не сообщалось как таковой. Когда я уменьшил размер партии моей модели, это сработало. Может быть, вы должны проверить, так ли это.

Другие вопросы по тегам