Более высокий показатель степени в пау уменьшает инструкции в шейдере? - PullRequest
0 голосов
/ 23 апреля 2011

Когда я компилирую шейдер HLSL с pow(foo, 6) или pow(foo, 8), компилятор создает сборку, которая содержит примерно на 10 команд больше, чем если бы я создавал тот же шейдер с pow(foo, 9) или pow(foo,10) или pow(foo,7).

Почему это?

Ответы [ 2 ]

5 голосов
/ 23 апреля 2011

Инструкция или инструкция Слоты ?

Инструкция pow занимает три 3 слота, тогда как инструкция mul занимает только 1.

(Ссылка: инструкцияустанавливает для: vs_2_0 , ps_2_0 , vs_3_0 , ps_3_0 )

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

Степень 1, очевидно, не является опцией.Степень 2 требует одну mul инструкцию.Полномочия 3 и 4 могут быть сделаны с двумя mul инструкциями.Поля 5, 6 и 8 могут быть выполнены с помощью трех mul инструкций.

(я думаю, математика этой оптимизации объясняется ссылкой , которую опубликовал Джим Льюис.)

Вероятная причина, по которой компилятор выбирает три mul инструкции вместо одной pow инструкции (обе используют одинаковое количество интервалов команд), заключается в том, что для инструкции pow с постоянным показателем также потребуется распределениепостоянного регистра для хранения этого показателя.Очевидно, что использование трех слотов инструкций и отсутствие константных регистров лучше, чем использование трех слотов инструкций и одного регистра констант.

(Почему вы получаете на 10 больше инструкций? Я не уверен, это будетзависит от вашего кода шейдера. Компилятор HLSL делает много странных и замечательных вещей во имя оптимизации.)

Если вы используете компилятор шейдера (fxc) в DirectX SDK с параметрами /Cc /Fc output.html,это даст вам хорошее чтение сборки, которое вы можете изучить, включая количество используемых слотов инструкций.

1 голос
/ 23 апреля 2011

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

...