2010-07-29 3 views
5

Есть ли способ совместного использования графического процессора между двумя отдельными программами, поддерживающими OpenCL, или, более конкретно, между двумя отдельными процессами, которые одновременно требуют, чтобы GPU выполнял ядра OpenCL? Если да, то как это делается?Совместное использование графического процессора между программами, поддерживающими OpenCL

ответ

4

Это зависит от того, что вы называете общим.

В общем, вы можете создать 2 процесса, которые одновременно создают устройство OpenCL на одном и том же графическом процессоре. Тогда ответственность драйвера/ОС/GPU заключается в том, чтобы убедиться, что все работает.

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

Я чувствую, что это не совсем то, что вам нужно. Можете ли вы расширить свой вопрос в случае использования?

+0

Вариант использования будет одним процессом с использованием OpenCL для использования GPU в течение длительного периода времени. Если запускается другой процесс OpenCL, который также требует GPU, как это обрабатывается? В вашем ответе указывается, что драйвер будет нарезать время, то есть распределить весь GPU на один процесс в любой момент времени. Несомненно, это неэффективно, учитывая, что данные, связанные с каждым процессом, должны быть скопированы назад и вперед между устройством и хостом? – Chris

+0

@ Крис: короткий ответ заключается в том, что не все данные необходимо скопировать. выполнение выполняется с временным разделением, но память может оставаться разделенной, если оба подходят на карте (память «виртуализирована». См. URL-адрес ниже). Если он не подходит, то он точно скопирует данные. Кроме того, зернистость нарезки времени тоже грубая. Предполагая, что мы говорим о Windows, в WDDM 1.1, запуск ядра CL никогда не прерывается, и многое другое. См. Http://en.wikipedia.org/wiki/Windows_Display_Driver_Model для получения дополнительной информации. – Bahbar

+0

В частности: http://download.microsoft.com/download/5/b/9/5b97017b-e28a-4bae-ba48-174cf47d23cd/PRI103_WH06.ppt – Bahbar

4

Текущие графические процессоры (кроме NVidia's Fermi) не поддерживают одновременное выполнение нескольких ядер. Более того, к этой дате GPU не поддерживают упреждающую многозадачность; он полностью кооператив! Выполнение ядра не может быть приостановлено и продолжено позже. Таким образом, гранулярность любого совместного использования GPU на основе времени зависит от времени выполнения ядер.

Если у вас есть несколько запущенных программ, требующих доступа к GPU, вы должны убедиться, что ваши ядра имеют короткие промежутки времени (< 100 мс - это эмпирическое правило), так что время GPU может быть выделено между ядрами, требующими циклов GPU , Также важно сделать это, так как в противном случае графика хост-системы будет очень невосприимчивой, так как им также нужен доступ к GPU. Это может зайти так далеко, что ядро ​​в бесконечном или длинном цикле, по-видимому, приведет к сбою системы.

Смежные вопросы