Когда основной контекст CUDA уничтожается Runtime API?
В этом обсуждении среды выполнения и API драйвера говорится, что
Первичные контексты создаются по мере необходимости, по одному на устройство на процесс, подсчитываются ссылки и затем уничтожаются, когда на них больше нет ссылок.
Что считается такими ссылками? И - не означает ли это, что часто предполагается, что первичный контекст уничтожается сразу после многократного использования? например, вы получаете идентификатор устройства по умолчанию, а затем запускаете ядро; какие "ссылки" остаются? Конечно, это не целочисленная переменная, содержащая идентификатор устройства...
1 ответ
Ни одна из точных внутренних работ API среды выполнения не задокументирована, и есть эмпирические доказательства того, что они незначительно изменились с течением времени. Тем не менее, если вы проверите шаблон кода хоста, который генерирует инструментальная цепочка, и запустите некоторые трассировки на стороне хоста, можно сделать вывод, как он работает, и то, что следует ниже, является моим пониманием на основе наблюдений, сделанных таким образом.
Важно понимать, что подсчет ссылок на первичный контекст - это внутренняя функция в драйвере, а сам механизм "ленивого установления контекста" использует некоторые внутренние перехватчики API, которые либо привязываются к существующему первичному контексту, явно созданному API драйвера (который увеличивает счетчик ссылок) или создайте его, если его нет, а затем выполните привязку к этому контексту (что также увеличивает счетчик ссылок). Подпрограммы, которые отключаются от основного контекста, регистрируются черезatexit
и сработает при выходе из приложения или когда cudaDeviceReset()
называется.
Этот подход предотвращает предложенный вами потенциальный сценарий, при котором контексты непрерывно уничтожаются, когда их счетчик ссылок падает до нуля, а затем воссоздаются при вызове другого функционала API среды выполнения. Этого не бывает.