оптимизация gpu при умножении на степени 2 в шейдере - PullRequest
0 голосов
/ 04 января 2019

Оптимизируют ли современные графические процессоры умножение на степени 2, сдвигая бит?Например, предположим, что в шейдере я делаю следующее:

float t = 0;
t *= 16;
t *= 17;

Возможно ли, что первое умножение будет выполняться быстрее, чем второе?

1 Ответ

0 голосов
/ 11 января 2019

Умножение с плавающей запятой не может быть выполнено с помощью сдвига битов.Однако теоретически умножение с плавающей запятой на 2 константы можно оптимизировать .Значение с плавающей запятой обычно хранится в виде S * M * 2 ^ E, где S - знак, M - мантисса и E - показатель степени.Умножение на степень 2 можно сделать, добавив / вычтя часть экспоненты float, не изменяя другие части.Но на практике я бы поспорил, что на графических процессорах всегда используется общая команда умножения.

У меня было интересное наблюдение относительно мощности 2 констант при изучении вывода разборки PVRShaderEditor (графических процессоров PowerVR).Я заметил, что в определенном диапазоне мощностей 2 констант ([2 ^ (- 16), 2 ^ 10] в моем случае) используются специальные обозначения, например, C65, подразумевая, что они предопределены.Принимая во внимание, что произвольные константы, такие как 3.0 или 2.3, используют нотацию общего регистра (например, SH12), что подразумевает, что они хранятся как единое целое и, вероятно, требуют некоторой стоимости установки.Таким образом, использование мощности 2 констант может дать некоторую оптимизационную выгоду, по крайней мере, на некотором оборудовании.

...