Войти
ПрограммированиеФорумОбщее

Быстрый точный sin/cos из float32. (6 стр)

Страницы: 15 6 7 816 Следующая »
#75
17:44, 1 сен 2015

На всякий случай, сохраню здесь:

Код на Maxima, считающий оптимальный в L2-смысле полином, приближающий синус, с коэффициентами, прибитыми гвоздями к представимым во float32 числам (в примере - на \(\left[ -\pi ;\; +\pi \right]\), коэффициент при x гарантированно 1):

+ Показать

Код на Maxima, выделяющий часть (двоичных) знаков числа \(\pi\), в виде вещественного числа:

+ Показать

Точное (десятичное) значение float32-числа по его битам (исключая денормализованные и т. п.):

bits2decimal(n):=bfloat((1+mod(n,2^23)/2^23)*2^(mod(floor(n/2^23),2^8)-127));

В качестве онлайн-Maxima использую http://maxima.cesga.es/ .

#76
18:28, 1 сен 2015

Ну и быстрые версии, для тех, кому плевать на точность:

http://rextester.com/RIP91276

#77
20:08, 1 сен 2015

FordPerfect
На инстриктах читаемость кода упала в разы :(

#78
20:32, 1 сен 2015

Bishop
По сравнению с C++ версией или с asm?

Ну а вообще "любители MSVC должны страдать".
Портабельность, всё такое.

#79
20:34, 1 сен 2015

FordPerfect
> Просьба потестить.

Win7 x64, i7-4710HQ
VS2015, Release x64, макс оптимизация (под спойлером),

sin_f32_sse2_intrin на 20% медленнее предыдущего С++ аналога (sin_f32)
И это я ещё вынес  объявления статиков из тела функции, а то скорость была 2 раза хуже sin_f32.

Дисассемблер и оптимизации:

+ Показать

Я так понимаю, VS забивает на твои интринзики, переписывает по-своему и, в итоге, не может хорошо оптимизировать. Может я что-то напутал в параметрах проекта?
Код тот же, что и раньше:

+ Показать
#80
21:18, 1 сен 2015

FordPerfect
> По сравнению с C++ версией или с asm?
С asm конечно.

#81
21:43, 1 сен 2015

PaulSh
Как интере~есно...
Спасибо, кстати.

>И это я ещё вынес объявления статиков из тела функции, а то скорость была 2 раза хуже sin_f32.
Ох ты блин. И в gcc тоже. Т. е. оно не умеет вынести _mm_set в compile-time и честно пишет вот такой ужас:
http://www.everfall.com/paste/id.php?g7yldd8go81p

То, что компиляторы интринсики уровня <emmintrin.h> могут реализовать через AVX - для меня новость (это как бы намекает на уровень знания мной интринсиков). Проверил - gcc, icc и clang делают то же самое.

И, похоже все компиляторы решают константы сначала загрузить в регистр, а уже потом делать арифметику. В смысле, в случае интринсик. И для данного конкретного кода это, похоже, получается тормознее.

Вот, ради интереса, что пишут gcc и icc, если вынести константы отдельно (код инициализации констант - там же):
gcc: http://www.everfall.com/paste/id.php?qlhorvlyhs8k
icc: http://www.everfall.com/paste/id.php?p2gi754bx6h8

Для C++ случая, без интринсик (но с SSE2-арифметикой) - они вполне себе складывают/множат прямо из памяти:
http://www.everfall.com/paste/id.php?6sp5nwfmo0am (gcc)

Тут впрочем, часть операций вообще идёт не через SSE.
Но для 4-ствольной версии такой вариает не идёт же?

Bishop
Дело вкуса, наверно.
Мне asm читать, пожалуй, тоже симпатичнее.
Механически переносить C++ код на интринсики похоже, что проще, чем на asm.

#82
23:20, 1 сен 2015

А если у тебя много КЦ синусов, то можно написать вот так:

+ Показать

И тогда константы в циклах замечательно лягут в регистры (у gcc, по крайней мере), и будет шустрее (по моим замерам).

http://rextester.com/SGW57300 - GCC.
http://rextester.com/WOJGS76842 - MSVC.

Полторы наносекунды на синус, хм.

#83
0:08, 2 сен 2015

PaulSh
Ну... я целюсь в SSE2.
А так да: __m256-версия - логичный следующий шаг.

#84
0:35, 2 сен 2015

PaulSh

Написал такое:

+ Показать

Но и меня его и проверить-то негде.

Оно вообще работает?

#85
0:40, 2 сен 2015

Да, цивилизованные люди, видимо, использовали бы FMA, но речь не об этом, пока.

#86
19:24, 5 сен 2015

FordPerfect
>Та как-то не зажгла.
>Вопрос: так и должно быть, или у меня руки кривые?
Понял, я хреново мерил.
Если убрать

x[1]=s;

в test_sse_x4, то будет примерно та же скорость, что и у одноствольной.

И да, есть желающие потестить код из #88? Я не знаю даже, запускается ли он.

#87
21:57, 5 сен 2015

Сделал gcc-asm версии #85:
http://rextester.com/IIB25905
Впрочем, интринсики не обогнал, GCC довольно внятно сделал (ну или я фигню пишу).

Кстати, в #62, по хорошему, наверное, надо "memory" добавить в clobber-list в параллельных версиях.

#88
10:22, 6 сен 2015

FordPerfect
> И да, есть желающие потестить код из #88? Я не знаю даже, запускается ли он.
У меня не собрался

+ Показать

какие-то опции надо при сборке указывать?

#89
13:24, 6 сен 2015

kipar
-mavx2, вроде.

Страницы: 15 6 7 816 Следующая »
ПрограммированиеФорумОбщее

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