A2 & Oberon GOOGLE trans to English      Помощь      Поиск      Пользователи  Файловый архив


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

> Описание: Арифметика с фиксированной точкой
sage Администратор
Отправлено: 03 Декабря, 2008 - 08:23:49
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




По-видимому можно забивать последний гвоздь в крышку гроба арифметики с фиксированной точкой для машин имеющих 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

Скачать файл: FixPtMathBench.Mod
Скачан раз: 428
 
 Top
BohdanT Администратор
Отправлено: 03 Декабря, 2008 - 10:09:02
Post Id



Super Member


Покинул форум
Сообщений всего: 606
Дата рег-ции: Июль 2008  
Откуда: Киев, Украина
Репутация: 2




sage пишет:
У меня получилось только с использованием POP

По другому никак Недовольство, огорчение
Странно вообще то, нормально сделать ничего не стоит...
 
 Top
sage Администратор
Отправлено: 03 Декабря, 2008 - 10:35:12
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




BohdanT пишет:
Странно вообще то, нормально сделать ничего не стоит...
Задал вопрос http://www.ocp.inf.ethz.ch/forum...topic,204.0.html Подмигивание
(Добавление)
Можно ещё потестить с inline версиями SSE-оптимизированных векторных операций Закатив глазки
Имеет смысл тестировать MMX c fixed point? MMX кажется только целочисленные инструкции содержит Ниндзя Для старых машин может и пригодиться Подмигивание
 
 Top
BohdanT Администратор
Отправлено: 03 Декабря, 2008 - 11:43:11
Post Id



Super Member


Покинул форум
Сообщений всего: 606
Дата рег-ции: Июль 2008  
Откуда: Киев, Украина
Репутация: 2




Если бы сделали, что бы можно было обероновские, а не только асмовские инлайн-процедуры писать Закатив глазки
 
 Top
sage Администратор
Отправлено: 03 Декабря, 2008 - 16:32:11
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




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
Разрыв увеличился Подмигивание
 
 Top
BohdanT Администратор
Отправлено: 03 Декабря, 2008 - 17:20:27
Post Id



Super Member


Покинул форум
Сообщений всего: 606
Дата рег-ции: Июль 2008  
Откуда: Киев, Украина
Репутация: 2




Ну да каждая пара PUSH и POP при передаче параметров это операция память-память + память-регистр (три операции пересылки с памятью)... где уж тут быстродействие возьмётся... Отстой


Отредактировано администратором: sage, 03 Декабря, 2008 - 17:26:47
 
 Top
sage Администратор
Отправлено: 03 Декабря, 2008 - 17:40:13
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




Не на ту кнопку нажал Не понял
 
 Top
sage Администратор
Отправлено: 03 Декабря, 2008 - 23:02:54
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




Сделал 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

Скачать файл: FixPtMathBench.Mod
Скачан раз: 444
 
 Top
sage Администратор
Отправлено: 04 Декабря, 2008 - 08:06:12
Post Id


Full Member


Покинул форум
Сообщений всего: 218
Дата рег-ции: Июнь 2008  
Откуда: Киев, Украина
Репутация: 0




Векторное и скалярное произведения немножко пошустрее:
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;
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0)
« Творческие идеи и проекты »


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



Locations of visitors to this page
[Valid RSS]

RSS

Valid CSS!


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

[Script Execution time: 0.0289]     [ Gzipped ]