Время жизни процесса CUDA

Кажется, я не понял чего-то существенного в CUDA. Я использую приложение с графическим интерфейсом C++ для запуска некоторых ядер на карте с двумя графическими процессорами. Когда я запускаю хост-процесс, в списке нет ни одного процесса. Это ожидаемо, потому что хост-процесс ждет, пока я не нажму кнопку, прежде чем он использует CUDA и запускает ядра. Если я нажму кнопку, два ядра будут нормально работать на обоих графических процессорах, выйдут и вернут ожидаемые результаты. После этого хост-процесс будет указан два раза, по одному разу для каждого графического процессора. Оба процесса видны, пока я не выйду из хост-процесса.

Я немного смущен, потому что нет такой вещи, как или же функция (или аналогичная пара функций).

Какие вызовы API CUDA приводят к тому, что процесс включается в список ? Какие вызовы API CUDA вызывают удаление процесса из списка?

1 ответ

Это объясняется в документации CUDA, раздел 3.2.1. https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#initialization

3.2.1. Инициализация

Для среды выполнения нет явной функции инициализации; он инициализируется при первом вызове функции времени выполнения (точнее, любой функции, отличной от функций из разделов обработки ошибок и управления версиями справочного руководства). Необходимо помнить об этом при расчете времени вызовов функций времени выполнения и при интерпретации кода ошибки из первого вызова во время выполнения.

Среда выполнения создает контекст CUDA для каждого устройства в системе (дополнительные сведения о контекстах CUDA см. в разделе Контекст). Этот контекст является основным контекстом для этого устройства и инициализируется в первой функции времени выполнения, которая требует активного контекста на этом устройстве. Он совместно используется всеми потоками хоста приложения. В рамках создания этого контекста код устройства при необходимости своевременно компилируется (см. «Точная компиляция») и загружается в память устройства. Это все происходит прозрачно. При необходимости, например, для взаимодействия с API-интерфейсом драйвера, к основному контексту устройства можно получить доступ из API-интерфейса драйвера, как описано в разделе «Взаимодействие между API-интерфейсами среды выполнения и драйвера».

Когда хост-поток вызывает cudaDeviceReset(), это уничтожает первичный контекст устройства, с которым в данный момент работает хост-поток (т. е. текущее устройство, как определено в Выборе устройства). Следующий вызов функции среды выполнения, сделанный любым потоком хоста, для которого это устройство является текущим, создаст новый первичный контекст для этого устройства. Примечание. Интерфейсы CUDA используют глобальное состояние, которое инициализируется при запуске хост-программы и уничтожается при завершении хост-программы. Среда выполнения CUDA и драйвер не могут определить, является ли это состояние недопустимым, поэтому использование любого из этих интерфейсов (неявно или явно) во время запуска или завершения программы после main) приведет к неопределенному поведению.

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