Как я могу контролировать, какие вычисления выполняются на CPU, а какие на GPU?

14

В настоящее время я понимаю, что все, что делается в файле шейдера, выполняется на графическом процессоре, а все, что делается в моем (в моем случае, Java) коде, выполняется на процессоре.

Это точное описание?

Bassinator
источник
2
Также вы можете выполнять вычисления на GPU, используя что-то вроде OpenCL, что, по сути, позволяет запускать код на GPU.
Мыльный

Ответы:

20

Это суть этого.

В принципе, платформа могла бы делать все, что захочет. Можно представить себе продвинутую операционную систему, выполняющую своевременный перевод скомпилированного кода, скажем, из x86 в код GPU. Аналогично, драйверы OpenGL могут запускаться на процессоре хоста как угодно.

Но на самом деле, то, что вы только что описали, это то, что происходит.

Дэвид ван Бринк
источник
5
Во IIRC шейдеры компилируются в ЦП перед отправкой в ​​ГП. И это делается драйвером графического процессора без ОС.
MSalters
Правда. Я имел дело со многими ошибками компиляции во время выполнения программы в шейдерах, даже когда код Java уже скомпилирован.
Басинатор
1
Теоретически: допустим, у меня была программа, которая сильно загружала процессор, но была просто интерфейсом командной строки (без графической работы). Могу ли я переложить часть работы в графический процессор? Я на самом деле не планирую делать это, это просто концептуальная вещь, которая меня интересует.
Басинатор
2
Да! Ссылка, которую опубликовала @return true, предназначена для библиотеки Java, которая делает это. В более общем смысле вы можете написать «вычислительный шейдер» в OpenGL или использовать OpenCL. Во всех случаях вам нужно изолировать часть вашего кода, которая может быть распараллелена, и передавать информацию в нее и из нее. (Графические процессоры в основном отлично подходят для «смущающе параллельных» задач.)
Дэвид ван Бринк
1
Одна звездочка, которую нужно добавить к этому ответу, состоит в том, что некоторые реализации поддерживают идею «предварительного шейдера», то есть кода, который является частью шейдера, но результат которого будет постоянным во всех вызовах в данном вызове отрисовки (например, умножение унифицированного представления). & матрицы проекции). Склонный шейдерный компилятор может идентифицировать подобные биты кода и выводить их для выполнения на стороне процессора, включая полученный в результате постоянный вывод в работе, передаваемой в графический процессор. Это один из распространенных случаев, когда предположение «shader = GPU» может быть согнутым, но только в деталях.
DMGregory
7

Вообще да. Java используется для написания программ, которые работают на процессоре. Языки шейдеров (cg, hlsl и др.) Используются для написания программ, работающих на GPU.

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

вернуть истину
источник
1
Очень интересный совет, ваша ссылка на «апарапи». Запустить код JVM на GPU ... интригующе!
Дэвид ван Бринк
3

Дэвид ван Бринк ответил на ваш вопрос в целом.

Но, как он говорит, драйвер OpenGL может запускать что-то на процессоре, и это действительно часто случается. Особенно в контексте совместимости, где некоторые странные унаследованные функции не могут быть реализованы на графических картах. Они требуют программной эмуляции. Например, я слышал, что пока выполняется процессирование на процессоре. Можно ожидать и сюрпризов с комплектацией.
Эти сюрпризы могут случиться еще больше на MacOS с использованием контекстов 2.1, потому что Apple достаточно хорошо объединила представление OpenGL по всему их аппаратному диапазону, а некоторым меньшим аппаратным средствам не хватает некоторых вещей, которые нужно эмулировать. Дело доходит до того, что фактически можно полностью выполнить спецификацию ENTIRE OpenGL 2.1 на CPU, если код создания контекста явно указывает на программное устройство.

И наоборот, код, который выполняется с помощью вычислительных библиотек, таких как vexcl или boost compute, или AMP от Microsoft, или nVidia тяги, может выполняться на GPU или CPU в зависимости от флагов настройки API.

И, наконец, внутри процессора у вас также есть архитектура DSP, часть которой мы называем SIMD. Компилятор Intel ispc предоставляет помощь в создании кода, который «гарантированно» работает на линиях SIMD, с множеством средств диагностики производительности во время компиляции, чтобы помочь вам максимально использовать его. Добавьте к этому OpenMP, и вы получите многопоточную SIMD, которая подходит к понятиям графических процессоров. Если у вас высокопроизводительный ЦП и низкоуровневый ГП, это на самом деле может быть более производительным.
http://ispc.github.io/

v.oddou
источник