Несколько контекстов CUDA для одного устройства — какой смысл?

Я думал, что у меня это есть, но, видимо, нет 🙂 Мне нужно выполнить параллельное потоковое кодирование H.264 с NVENC из кадров, которые не находятся ни в одном из форматов, принятых кодировщиком, поэтому у меня есть следующий конвейер кода:

  • Обратный вызов, сообщающий, что новый кадр прибыл, называется
  • Я копирую кадр в память CUDA и выполняю необходимые преобразования цветового пространства (только первый cuMemcpy является синхронным, поэтому я могу вернуться из обратного вызова, все ожидающие операции помещаются в выделенный поток)
  • Я помещаю событие в поток, и другой поток ожидает его, как только оно установлено, я беру указатель памяти CUDA с рамкой в ​​правильном цветовом пространстве и передаю его в декодер.

По некоторым причинам у меня было предположение, что мне нужен выделенный контекст для каждого потока, если я выполняю этот конвейер в параллельных потоках. Код был медленным, и после некоторого чтения я понял, что переключение контекста на самом деле дорого, и затем я пришел к выводу, что это не имеет смысла, так как в контексте принадлежит весь графический процессор, поэтому я блокирую параллельную обработку от других потоков транскодера ,

Вопрос 1: В этом сценарии я хорошо с использованием одного контекста и явного потока, созданного в этом контексте для каждого потока, который выполняет упомянутый конвейер?

Вопрос 2: Может кто-то просветить меня о том, что является единственной целью контекста устройства CUDA? Я предполагаю, что это имеет смысл в сценарии с несколькими GPU, но есть ли случаи, когда я хотел бы создать несколько контекстов для одного GPU?

6

Решение

Вопрос 1: В этом сценарии я хорошо с использованием одного контекста и явного потока, созданного в этом контексте для каждого потока, который выполняет упомянутый конвейер?

Вам должно быть хорошо с одним контекстом.

Вопрос 2: Может ли кто-нибудь просветить меня о том, что является единственной целью контекста устройства CUDA? Я предполагаю, что это имеет смысл в сценарии с несколькими GPU, но есть ли случаи, когда я хотел бы создать несколько контекстов для одного GPU?

Контекст устройства CUDA обсуждается в руководство по программированию. Он представляет все состояние (карта памяти, выделения, определения ядра и другую информацию, связанную с состоянием), связанное с конкретным процессом (то есть связанным с использованием этого конкретного процесса графическим процессором). Отдельные процессы обычно будут иметь разные контексты (как и отдельные устройства), так как эти процессы имеют независимое использование графического процессора и независимые карты памяти.

Если вы используете многопроцессорное использование графического процессора, вы обычно создаете несколько контекстов на этом графическом процессоре. Как вы обнаружили, можно создать несколько контекстов из одного процесса, но обычно это не требуется.

И да, когда у вас несколько контекстов, для ядер, запущенных в этих контекстах, потребуется переключение контекста, чтобы перейти от одного ядра в одном контексте к другому ядру в другом контексте. Эти ядра не могут работать одновременно.

Использование API среды выполнения CUDA управляет контекстами за вас. Обычно вы явно не взаимодействуете с контекстом CUDA при использовании API времени выполнения. Однако при использовании драйвера API контекст создается и управляется явным образом.

10

Другие решения


По вопросам рекламы [email protected]