Что получается в ассемблере?
Mephisto std
AMD GPU Shader Analyzer тебе раскажет :)
Я знаю точно, что на шейдерах 1.0 и до 2.0 (возможно и 3.0) Pow делался из нескольких асм шейдерных команд.
А вот в шейдерах 5.0 уже вроде как для этого есть одна асм шейдер команда. Но возможно я и не прав, сейчас точно не скажу.
Вот может пригодится.
https://msdn.microsoft.com/en-us/library/windows/desktop/bb147285(v=vs.85).aspx
ну ок, а как считается ассемблерная команда pow?
Обычно целую часть считают succesive squaring, дробную разложением в тейлора, а потом перемножают.
Возведение в вещественную степень обычно считается через экспоненту (двоичную) отмасштабированного логарифма (двоичного).
Mephisto std
> ну ок, а как считается ассемблерная команда pow?
LLVM код, который генерит fxc делает это через логарифм и экспоненту.
Mephisto std
> Что получается в ассемблере?
Одна команда для SFU. Чтобы узнать что делается в нём вам нужно втереться в доверие инженерам NVidia, потому что ни в одних паперах, которые я только что находил, ничего про это не написано кроме того, что это делается быстро.
Mephisto std
Я знаю точно два момента.
1-й под разные версии шейдеров (1\2\3\4\5) будут разные асм команды
2-е как правило асм команд будет меньше в шейдерах версии 4.0 и 5.0 по сравнению с версиями 1.0\2.0\3.0
ronniko
> AMD GPU Shader Analyzer тебе раскажет :)
+1
Вот например:
void main() { gl_FragColor = vec4( pow( gl_FragCoord.x, gl_FragCoord.y)); }
На выходе:
; -------- Disassembly --------------------
00 ALU: ADDR(32) CNT(5)
0 x: ADD ____, R0.x, C0.x
w: MULADD R0.w, R0.y, C0.z, C0.y
1 t: LOG_sat ____, PV0.x
2 y: MUL ____, R0.w, PS1
3 t: EXP_e R0.x, PV2.y
01 EXP_DONE: PIX0, R0.xxxx
END_OF_PROGRAMНе пойму, в чём вопрос. Это есть начиная с SM 2.0, и в вертексных, и в пиксельных шейдерах, одной инструкцией:
pow dst, src0, src1
Или кого-то ещё волнует SM 1.X?
Mikle
Я думаю это вопрос из спора в другой теме, медленнее ли в шейдерах pow чем sqrt.
kipar
> Я думаю это вопрос из спора в другой теме, медленнее ли в шейдерах pow чем
> sqrt.
Был спор можно ли использовать sqrt/pow в шейдерах или ещё рано ?
Sergio
> На выходе:
ok. Как на GPU считается exp ?
innuendo
И был спор отличаются ли по сложности pow и sqrt или sqrt по сравнению c pow "жалкий".
Вспоминается тема про логарифм на CPU.
Там в конце foxes героически реверсит _mm_log2_pd, можно посмотреть код.
http://www.gamedev.ru/code/forum/?id=195519
Случайное гугление нашло
https://seblagarde.wordpress.com/tag/gpu-performance/
– instruction are full rate or quater rate, i.e this is equivalent to say there is instruction which are 4x slower than other. Full rate (FR): mul, mad, add, sub, and, or, bit shift… Quater rate(QR): transcendental instruction like rcp, sqrt, rsqrt, cos, sin, log, exp…
– macro instructions can expand to several instructions: tan, acos, asin, atan, pow, sign, length…
Будучи ни разу не специалистом, понятия не имею, насколько оно по делу.
Тема в архиве.