Будет ли макет квалификатора GLSL (row_major) поддерживать производительность для операций M * v? [Дубликат]

db.example.updateMany({},{"$unset":{"tags.words":1}})

Мы также можем использовать это для обновления нескольких документов.

9
задан Nicol Bolas 26 May 2012 в 00:26
поделиться

3 ответа

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

11
ответ дан Nicol Bolas 23 August 2018 в 23:55
поделиться

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

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

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

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

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

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

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

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

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

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

5
ответ дан doug65536 23 August 2018 в 23:55
поделиться

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

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

0
ответ дан Joe 23 August 2018 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: