создание контекста cuda и ассоциация ресурсов в приложениях API среды выполнения

Я хочу понять, как создается контекст cuda и связывается с ядром в приложениях API времени выполнения cuda?

Я знаю, что это делается под капотом с помощью API драйверов. Но хотелось бы разобраться в сроках создания.

Для начала я знаю, что cudaRegisterFatBinary - это первый вызов cuda api, который регистрирует файл fatbin во время выполнения. За ним следует несколько API-интерфейсов регистрации функций cuda, которые вызывают cuModuleLoad на уровне драйвера. Но тогда, если мое приложение API времени выполнения Cuda вызывает cudaMalloc, как указатель на эту функцию связан с контекстом, который, как я считаю, должен был быть создан заранее. Как получить дескриптор этого уже созданного контекста и связать с ним будущие вызовы API среды выполнения? Пожалуйста, демистифицируйте внутреннюю работу.

Чтобы процитировать документацию NVIDIA по этому

вызовы CUDA Runtime API работают с CUcontext API драйвера CUDA, который привязан к текущему потоку хоста.

Если не существует CUcontext API драйвера CUDA, привязанного к текущему потоку во время вызова CUDA Runtime API, который требует CUcontext, тогда среда выполнения CUDA неявно создаст новый CUcontext { {1}} перед выполнением звонка.

Если среда выполнения CUDA создает CUcontext, тогда CUcontext будет создан с использованием параметров, указанных в CUDA Runtime API , функции cudaSetDevice, cudaSetValidDevices, cudaSetDeviceFlags, cudaG3SetGudaDetGuda , cudaD3D10SetDirect3DDevice и cudaD3D11SetDirect3DDevice. Обратите внимание, что эти функции завершатся ошибкой с cudaErrorSetOnActiveProcess, если они вызываются, когда CUcontext привязан к текущему потоку хоста.

Время жизни CUcontext управляется механизмом подсчета ссылок .Счетчик ссылок CUcontext изначально установлен на 0, , увеличивается на cuCtxAttach и уменьшается на cuCtxDetach.

Если CUcontext создается средой выполнения CUDA, тогда среда выполнения CUDA будет уменьшать счетчик ссылок этого CUcontext в функции cudaThreadExit. Если CUcontext создается API драйвера CUDA (или создается отдельным экземпляром библиотеки CUDA Runtime API), тогда CUDA Runtime не будет увеличивать или уменьшать ссылку {{1 }} количество этого контекста CUcontext.

Все состояния CUDA Runtime API (например, адреса глобальных переменных и значения ) перемещаются вместе с лежащим в основе CUcontext. В частности, если CUcontext перемещается из одного потока в другой (с использованием cuCtxPopCurrent и cuCtxPushCurrent), то все состояние CUDA Runtime API также перемещается в этот поток.

Но я не понимаю, как среда выполнения cuda создает контекст? какие вызовы API используются для этого? Компилятор nvcc вставляет некоторые вызовы API для этого во время компиляции или это делается полностью во время выполнения? Если первое верно, какие API времени выполнения используются для этого управления контекстом? Чем позже правда, как именно это делается?

Если контекст связан с потоком хоста, как мы можем получить доступ к этому контексту? Связывается ли он автоматически со всеми переменными и ссылками на указатели, с которыми работает поток?

как в конечном итоге выполняется загрузка модуля в контексте?

6
задан ash 23 September 2011 в 21:40
поделиться