A2 & Oberon » Программирование » Творческие идеи и проекты » Fixed Point Math

Страниц (1): [1]
 

1. sage - 03 Декабря, 2008 - 08:23:49 - перейти к сообщению
По-видимому можно забивать последний гвоздь в крышку гроба арифметики с фиксированной точкой для машин имеющих FPU на борту Подмигивание
Я сделал небольшой бенчмарк на основе алгоритма Moller-Trumbore, используемого для проверки пересечения лучём треугольника. Самый основной пожалуй алгоритм для техники трассировки лучей, но данный ещё не самый быстрый из существующих Улыбка
Так вот, на моей машине результат бенчмарка показал уверенное отставание арифметики с фиксированной точкой и оптимизацией умножения с помощью inline-функции от арифметики с плавающей точкой в процедуре без всяких оптимизаций (единственная пожалуй оптимизация, - алгоритм не вызыват внутри никаких других процедур) где-то на 30-35 процентов.
Может ещё что-то можно оптимизировать Закатив глазки
Вот inline-функция умножения:
PROCEDURE -FPMul(fp1, fp2: LONGINT): LONGINT;
CODE {SYSTEM.i386}
POP EAX
POP EDX
IMUL EDX (* IMUL r/m32  (EDX:EAX <-- EAX * r/m dword) *)
SHRD EAX, EDX, BITS
END FPMul;
Как правильно получать операнды в теле inline-процедур? У меня получилось только с использованием POP Ниндзя

Результаты вычисления достаточно точные (24 бита отводится на дробную часть числа):
Цитата:
Fixed point numbers range = -128 ... 127
FP_EPSILON = 17
EPSILON = 1.E-006

time = 9985
t = 0.000000000000000E+000
u = 1.800000000000000E+001
v = 9.000000000000000E+000
v = 3.600000000000000E+001

time = 13437
t = 0.000000000000000E+000
u = 1.800000000000000E+001
v = 9.000000000000000E+000
v = 3.600000000000000E+001

rate = 1.345718577866800E+000
2. BohdanT - 03 Декабря, 2008 - 10:09:02 - перейти к сообщению
sage пишет:
У меня получилось только с использованием POP

По другому никак Недовольство, огорчение
Странно вообще то, нормально сделать ничего не стоит...
3. sage - 03 Декабря, 2008 - 10:35:12 - перейти к сообщению
BohdanT пишет:
Странно вообще то, нормально сделать ничего не стоит...
Задал вопрос http://www.ocp.inf.ethz.ch/forum...topic,204.0.html Подмигивание
(Добавление)
Можно ещё потестить с inline версиями SSE-оптимизированных векторных операций Закатив глазки
Имеет смысл тестировать MMX c fixed point? MMX кажется только целочисленные инструкции содержит Ниндзя Для старых машин может и пригодиться Подмигивание
4. BohdanT - 03 Декабря, 2008 - 11:43:11 - перейти к сообщению
Если бы сделали, что бы можно было обероновские, а не только асмовские инлайн-процедуры писать Закатив глазки
5. sage - 03 Декабря, 2008 - 16:32:11 - перейти к сообщению
sage пишет:
У меня получилось только с использованием POP
Общими усилиями с Богданом таки нашли правильный способ передачи параметров Закатив глазки
перед входом в тело инлайн процедуры следуют команды PUSH в количестве соответствующем числу параметров, следовательно мы в теле процедуры обязаны вызвать соответствующее количество команд POP либо скорректировать содержимое ESP Улыбка
Тогда возможны такие варианты процедуры FPMul:
PROCEDURE -FPMul(fp1, fp2: LONGINT): LONGINT;
CODE {SYSTEM.i386}
POP EAX
IMUL DWORD [ESP]
SHRD EAX, EDX, BITS
ADD ESP, 4
END FPMul;
PROCEDURE -FPMul(fp1, fp2: LONGINT): LONGINT;
CODE {SYSTEM.i386}
MOV EAX, DWORD 4[ESP]
IMUL DWORD [ESP]
SHRD EAX, EDX, BITS
ADD ESP, 8
END FPMul;
Заодно, результаты бенчмарка на Core Duo E2160:
Цитата:
Fixed point numbers range = -128 ... 127
FP_EPSILON = 17
EPSILON = 1.E-006

time = 10484
t = 0.000000000000000E+000
u = 1.800000000000000E+001
v = 9.000000000000000E+000
v = 3.600000000000000E+001

time = 15938
t = 0.000000000000000E+000
u = 1.800000000000000E+001
v = 9.000000000000000E+000
v = 3.600000000000000E+001

rate = 1.520221289584128E+000

Предыдущие результаты были получены на одноядерном P4 с технологией HT
Разрыв увеличился Подмигивание
6. BohdanT - 03 Декабря, 2008 - 17:20:27 - перейти к сообщению
Ну да каждая пара PUSH и POP при передаче параметров это операция память-память + память-регистр (три операции пересылки с памятью)... где уж тут быстродействие возьмётся... Отстой
7. sage - 03 Декабря, 2008 - 17:40:13 - перейти к сообщению
Не на ту кнопку нажал Не понял
8. sage - 03 Декабря, 2008 - 23:02:54 - перейти к сообщению
Сделал SSE inline версии векторного и скалярного произведений. Результаты не впечатляющие. Много времени тратится на загрузку регистров.
Если уж и переписывать на ассемблер то сразу крупные куски... Хорошо
Или использовать привычный код на языке высокого уровня оптимизируя алгоритмы в целом.
Цитата:
Fixed point numbers range = -128 ... 127
FP_EPSILON = 17
EPSILON = 1.013278961181640E-006

Using ordinary floating-point math
time = 10203
t = 0.000000000000000E+000
u = 1.800000000000000E+001
v = 9.000000000000000E+000
det = 3.600000000000000E+001

Using fixed-point math with inline FPMul
time = 13218
t = 0.000000000000000E+000
u = 1.800000000000000E+001
v = 9.000000000000000E+000
det = 3.600000000000000E+001

Using floating-point math with inline SSE procedures
time = 18157
t = 0.000000000000000E+000
u = 1.800000000000000E+001
v = 9.000000000000000E+000
det = 3.600000000000000E+001
9. sage - 04 Декабря, 2008 - 08:06:12 - перейти к сообщению
Векторное и скалярное произведения немножко пошустрее:
PROCEDURE -vecDot(VAR c: REAL; CONST a, b: Vector);
CODE {SYSTEM.i386, SYSTEM.SSE}
POP EDX (* b *)
POP EAX (* ADD ESP, 4 *)
POP ECX (* a *)
POP EAX (* ADD ESP, 4 *)
POP EBX (* c *)
MOVUPS XMM0, [ECX]
MOVUPS XMM1, [EDX]
MULPS XMM0, XMM1
MOVHLPS XMM1, XMM0
ADDPS XMM0, XMM1
MOVAPS XMM1, XMM0
SHUFPS XMM0, XMM0, 1
ADDPS XMM0, XMM1
MOVSS [EBX], XMM0
END vecDot;
PROCEDURE -vecCross(VAR c: Vector; CONST a, b: Vector);
CODE {SYSTEM.i386, SYSTEM.SSE}
POP EDX (* b *)
POP EAX (* ADD ESP, 4 *)
POP ECX (* a *)
POP EAX (* ADD ESP, 4 *)
POP EBX (* c *)
POP EAX (* ADD ESP, 4 *)
MOVUPS XMM0, [ECX]
MOVUPS XMM1, [EDX]
MOVAPS XMM2, XMM0
MOVAPS XMM3, XMM1
SHUFPS XMM0, XMM0, 201
SHUFPS XMM1, XMM1, 210
SHUFPS XMM2, XMM2, 210
SHUFPS XMM3, XMM3, 201
MULPS XMM0, XMM1
MULPS XMM2, XMM3
SUBPS XMM0, XMM2
MOVUPS [EBX], XMM0
END vecCross;

Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.015]     [ Gzipped ]