ПрограммированиеФорумГрафика

pow в шейдерах - как считается?

Страницы: 1 2 Следующая »
#0
18:27, 22 апр 2015

Что получается в ассемблере?

#1
18:32, 22 апр 2015

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

#2
18:43, 22 апр 2015

ну ок, а как считается ассемблерная команда pow?

#3
19:55, 22 апр 2015

Обычно целую часть считают succesive squaring, дробную разложением в тейлора, а потом перемножают.

#4
20:32, 22 апр 2015

Возведение в вещественную степень обычно считается через экспоненту (двоичную) отмасштабированного логарифма (двоичного).

#5
20:50, 22 апр 2015

Mephisto std
> ну ок, а как считается ассемблерная команда pow?
LLVM код, который генерит fxc делает это через логарифм и экспоненту.

#6
21:00, 22 апр 2015

Mephisto std
> Что получается в ассемблере?
  Одна команда для SFU. Чтобы узнать что делается в нём вам нужно втереться в доверие инженерам NVidia, потому что ни в одних паперах, которые я только что находил, ничего про это не написано кроме того, что это делается быстро.

#7
21:57, 22 апр 2015

Mephisto std
Я знаю точно два момента.
1-й под разные версии шейдеров (1\2\3\4\5) будут разные асм команды
2-е как правило асм команд будет меньше в шейдерах версии 4.0 и 5.0 по сравнению с версиями 1.0\2.0\3.0

#8
1:39, 23 апр 2015

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
#9
11:04, 23 апр 2015

Не пойму, в чём вопрос. Это есть начиная с SM 2.0, и в вертексных, и в пиксельных шейдерах, одной инструкцией:

pow dst, src0, src1

Или кого-то ещё волнует SM 1.X?

#10
11:16, 23 апр 2015

Mikle
Я думаю это вопрос из спора в другой теме, медленнее ли в шейдерах pow чем sqrt.

#11
11:20, 23 апр 2015

kipar
> Я думаю это вопрос из спора в другой теме, медленнее ли в шейдерах pow чем
> sqrt.

Был спор можно ли использовать sqrt/pow в шейдерах или ещё рано ?

#12
11:21, 23 апр 2015

Sergio
> На выходе:

ok. Как на GPU считается exp ?

#13
11:21, 23 апр 2015

innuendo
И был спор отличаются ли по сложности pow и sqrt или sqrt по сравнению c pow "жалкий".

#14
12:18, 23 апр 2015

Вспоминается тема про логарифм на 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…

Будучи ни разу не специалистом, понятия не имею, насколько оно по делу.

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.