2012-05-25 2 views
9

Я столкнулся с несколькими ситуациями, в которых утверждается, что выполнение точечного продукта в GLSL будет запущено за один цикл. Например:GLSL - Действительно ли точечный продукт стоит всего один цикл?

Вершина и процессоры фрагмента работают на четыре-векторах, выполняя четыре компонента инструкции, таких как дополнения, умножения умножения с накоплением или точечными продукты в одном цикле.

http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter35.html

Я также видел требование в комментариях где-то, что:

dot(value, vec4(.25)) 

был бы более эффективным способом средних четырех значений, по сравнению с:

(x + y + z + w)/4.0 

Опять же, было заявлено, что точка (vec4, vec4) будет работать в одном цикле.

Я вижу, что ARB says that dot product (DP3 and DP4) and cross product (XPD являются отдельными инструкциями, но означает ли это, что они столь же дорогостоящи, как и добавление vec4? Есть ли в этом случае какая-то аппаратная реализация, в соответствии с принципами многократного накопления на стероидах? Я вижу, как что-то подобное полезно в компьютерной графике, но в одном цикле может быть довольно много инструкций по их собственным звукам, как много.

ответ

11

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

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

Однако, есть некоторые аспекты, которые, конечно, можно ответить:

Я также видел требование в комментариях где-то, что:

бы более эффективный способ для средних четырех значений, по сравнению чтобы:

Я бы ожидать, что это будет своего рода правда, до тех пор, как x, y, z и w фактически являются различными значениями с плавающей точкой а не члены того же vec4 (то есть они не value.x, value.y и т. д.). Если они являются элементами одного и того же вектора, я бы сказал, что любой достойный оптимизирующий компилятор должен скомпилировать оба из них с одним и тем же набором инструкций. Хороший peephole optimizer должен ловить подобные узоры.

Я говорю, что это «доброта», потому что это зависит от аппаратного обеспечения. Точечная версия продукта должна по крайней мере не быть медленнее. И снова, если они являются элементами одного и того же вектора, оптимизатор должен его обработать.

отдельные инструкции, но означает ли это, что это так же дорого, как и для vec4?

Вы не должны считать, что ARB сборка имеет любое отношения к реальному коду инструкции аппаратной машины.

Есть ли в основном какая-то аппаратная реализация по линиям многократного накопления на стероидах в игре здесь?

Если вы хотите поговорить об оборудовании, это очень специфично для оборудования. Когда-то было специализированное аппаратное обеспечение точечного продукта. Это было во времена так называемых «DOT3 bumpmapping» и ранней DX8-эры шейдеров.

Однако, чтобы ускорить общие операции, им пришлось принять такие вещи. Итак, для большинства современных аппаратных средств (ака: что-то Radeon HD-класса или NVIDIA 8xxx или лучше. Так называемое аппаратное обеспечение DX10 или 11), точечные продукты делают в значительной степени то, что они говорят. Каждое умножение/добавление занимает цикл.

Однако это аппаратное обеспечение также допускает много параллелизма, поэтому у вас может быть 4 отдельных vec4 продуктов для точек, которые происходят одновременно . Каждый из них займет 4 цикла. Но, пока результаты этих операций не используются в других, все они могут выполняться параллельно. И, следовательно, четыре из них будут принимать 4 цикла.

Так что, опять же, это очень сложно. И аппаратно-зависимый.

Ваш лучший выбор - начать с чего-то, что разумно. Затем узнайте о аппаратном обеспечении, которое вы пытаетесь координировать, и работайте оттуда.

+0

Хорошо, спасибо. «Вы не должны предполагать, что сборка ARB имеет какое-либо отношение к фактическому коду команды аппаратного компьютера». это в основном сжатый ответ, на который я надеялся. Просто кажется, что ARB - это своего рода ниша и трудно найти много материалов, доступных для Google. Это было одним из тех вещей типа «племенного знания», которые я, казалось, не мог проверить, и тот факт, что это правда в течение определенного периода времени, имеет смысл. Классная вещь. – ultramiraculous

0

Ключ в том, что vec4 может быть «включен» в одну инструкцию (см. Работу Intel по 16-байтовым операциям регистра, что также является основой для ускоренной среды IOS).

Если вы начнете раскалывать и размахивать вектором, то больше не будет «одного адреса памяти» вектора для выполнения операции op.

4

Николь Болас выполнил практический ответ с точки зрения «сборки ARB» или взглянул на ИК-свалки. Я обращусь к вопросу «Как 4 кратных и 3 добавляет один цикл в аппаратном обеспечении? Это звучит невозможно»..

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

Не путайте это с одним циклом латентности!

С полностью конвейерным исполнением инструкция может быть разложена на несколько этапов трубопровода. Все этапы трубопровода работают одновременно.

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

Рассмотрим 4d-точечный продукт для гипотетического ядра с многократной задержкой в ​​3 цикла и добавим латентность в 5 циклов.

Если этот трубопровод был выложен наихудшим способом, без векторного параллелизма, он будет 4 умножения и 3 добавляет, давая в общей сложности 12 + 15 циклов для полной латентности 27 циклов.

Означает ли это, что точечный продукт занимает 27 циклов? Абсолютно нет, потому что он может начинать новый каждый цикл, и он получает ответ на это 27 циклов позже.

Если вам нужно было сделать одноточечный продукт и ему пришлось ждать ответа, вам придется подождать полную 27-секундную задержку для результата. Если, однако, у вас было 1000 отдельных точечных продуктов для вычисления, тогда это займет 1027 циклов. Первые 26 циклов, результатов не было, на 27-м цикле первый результат заканчивается, после того, как был выпущен 1000-й вход, потребовалось еще 26 циклов, чтобы последние результаты вышли в конец. Это делает точечный продукт «одним циклом».

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

+0

Это описательно сформулированный ответ, и я полностью его ценю! –

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

  • Нет связанных вопросов^_^