В чем разница между Nvidia Hyper Q и Nvidia Streams? - PullRequest
1 голос
/ 22 мая 2019

Я всегда думал, что технология Hyper-Q - не что иное, как потоки в графическом процессоре. Позже я обнаружил, что был неправ (не так ли?). Так что я немного читал о Hyper-Q и запутался еще больше. Я просматривал одну статью, и в ней было два утверждения:

A. Hyper-Q - это гибкое решение, которое позволяет отделять соединения от нескольких потоков CUDA, от нескольких процессов интерфейса передачи сообщений (MPI) или даже от нескольких потоков внутри процесса

B. Hyper-Q увеличивает общее количество соединений (рабочих очередей) между хостом и графическим процессором GK110, позволяя 32 одновременных соединения с аппаратным управлением (по сравнению с одним соединением, доступным в Fermi)

В вышеупомянутых точках Точка B говорит о том, что с одного хоста может быть создано несколько подключенных к одному графическому процессору. Означает ли это, что я могу создать несколько контекстов на простом графическом процессоре через разные приложения? Означает ли это, что мне придется выполнять все приложения в разных потоках? Что если все мои соединения потребляют память и вычислительные ресурсы, кто управляет планированием ресурсов (памяти / ядер)?

1 Ответ

4 голосов
/ 22 мая 2019

Думайте о HyperQ как о потоках, реализованных аппаратно на стороне устройства.

До прибытия HyperQ, например в Fermi команды (запуска ядра, передачи памяти и т. д.) из всех потоков помещались драйвером на хост в единую рабочую очередь. Это означало, что команды не могли обгонять друг друга, и вам нужно было осторожно выдавать их в правильном порядке на хосте , чтобы добиться наилучшего перекрытия.

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

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

Обратите внимание, что из 32 аппаратных очередей только 8 используются по умолчанию для экономии ресурсов. Установите для переменной среды CUDA_ DEVICE_ MAX_ CONNECTIONS более высокое значение, если вам нужно больше.

...