Несколько контекстов CUDA для одного устройства - какой смысл?
Я думал, что у меня это есть, но, видимо, нет:) Мне нужно выполнить параллельное потоковое кодирование H.264 с NVENC из кадров, которые не находятся ни в одном из форматов, принятых кодировщиком, поэтому у меня есть следующий конвейер кода:
- Обратный вызов, сообщающий, что новый кадр прибыл, называется
- Я копирую кадр в память CUDA и выполняю необходимые преобразования цветового пространства (только первый
cuMemcpy
является синхронным, поэтому я могу вернуться из обратного вызова, все ожидающие операции помещаются в выделенный поток) - Я помещаю событие в поток, и другой поток ожидает его, как только оно установлено, я беру указатель памяти CUDA с рамкой в правильном цветовом пространстве и передаю его в декодер.
По некоторым причинам у меня было предположение, что мне нужен выделенный контекст для каждого потока, если я выполняю этот конвейер в параллельных потоках. Код был медленным, и после некоторого чтения я понял, что переключение контекста на самом деле дорого, и затем я пришел к выводу, что это не имеет смысла, поскольку в контексте принадлежит весь графический процессор, поэтому я блокирую параллельную обработку от других потоков транскодера,
Вопрос 1: В этом сценарии я хорошо с использованием одного контекста и явного потока, созданного в этом контексте для каждого потока, который выполняет упомянутый конвейер?
Вопрос 2: Может ли кто-нибудь рассказать мне о том, что является единственной целью контекста устройства CUDA? Я предполагаю, что это имеет смысл в сценарии с несколькими графическими процессорами, но есть ли случаи, когда я хотел бы создать несколько контекстов для одного графического процессора?
1 ответ
Вопрос 1: В этом сценарии я хорошо с использованием одного контекста и явного потока, созданного в этом контексте для каждого потока, который выполняет упомянутый конвейер?
Вам должно быть хорошо с одним контекстом.
Вопрос 2: Может ли кто-нибудь рассказать мне о том, что является единственной целью контекста устройства CUDA? Я предполагаю, что это имеет смысл в сценарии с несколькими графическими процессорами, но есть ли случаи, когда я хотел бы создать несколько контекстов для одного графического процессора?
Контекст устройства CUDA обсуждается в руководстве по программированию. Он представляет все состояние (карта памяти, распределения, определения ядра и другую информацию, связанную с состоянием), связанное с конкретным процессом (т.е. связанное с этим конкретным процессом при использовании графического процессора). Отдельные процессы обычно будут иметь разные контексты (как и отдельные устройства), так как эти процессы имеют независимое использование графического процессора и независимые карты памяти.
Если вы используете многопроцессорное использование GPU, вы обычно создаете несколько контекстов на этом GPU. Как вы обнаружили, можно создавать несколько контекстов из одного процесса, но обычно это не требуется.
И да, когда у вас несколько контекстов, для ядер, запущенных в этих контекстах, потребуется переключение контекста для перехода от одного ядра в одном контексте к другому ядру в другом контексте. Эти ядра не могут работать одновременно.
Использование API среды выполнения CUDA позволяет вам управлять контекстами. Обычно вы явно не взаимодействуете с контекстом CUDA при использовании API времени выполнения. Однако при использовании драйвера API контекст создается и управляется явным образом.
Очевидно, прошло несколько лет, но теперь у NVENC/NVDEC, похоже, есть поддержка CUstream, начиная с версии 9.1 (примерно сентябрь 2019 г.) SDK видеокодека: https://developer.nvidia.com/nvidia-video-codec-sdk/download
НОВОЕ в 9.1- Кодирование: поддержка CUStream в NVENC для расширенного параллелизма между предварительной обработкой CUDA и кодированием NVENC
Я новичок в CUDA, но мое основное понимание состоит в том, что CUcontexts позволяют нескольким процессам использовать GPU (путем обмена контекстами, которые прерывают работу друг друга), в то время как CUstreams позволяют скоординированное совместное использование ресурсов GPU из одного процесса..