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

Быстрые и точные тригонометрические функции (4 стр)

Advanced: Тема повышенной сложности или важная.

Страницы: 1 2 3 4 5 6 Следующая »
#45
15:47, 25 мар. 2009

=A=L=X=

А четыре ненужых вызова movsd в вышеприведенном коде что-нибудь распараллеливают?


#46
15:48, 25 мар. 2009

Ghost2
>asvp
>Компилил vc80 и vc90. fstp вставляется автоматически.
>>А вот то, что уменя скомпилировалось при исправлении (заинлайнен):

Косяк за табой. Ты результат никуда не присваиваешь.
Напиши:
res=fpu_cos(a);
и у тебя выругается.

#47
15:53, 25 мар. 2009

asvp

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

Если эти условия не выполняются, то использование SSE это однозначный фейл. Про это уже кучу раз на этом форуме говорили и приводили результаты тестированиq. Arbitrary code всегда работает быстрее без SSE.

#48
15:55, 25 мар. 2009

asvp

>Косяк за табой. Ты результат никуда не присваиваешь.
Как этот код по твоему живет в релизе при /Ox?

#49
16:06, 25 мар. 2009

Ghost2
>А четыре ненужых вызова movsd в вышеприведенном коде что-нибудь
>распараллеливают?
Нет. Для правильной работы fld и fstp значения нужно положить/забрать в/из памяти.
По этой причине я не пользуюсь вставками ассма. Создается (иногда) лишний код.

Ghost2
>asvp
>SSE это хорошо, когда у тебя большой объем однотипных данных и однообразных
>вычислений, которые нужно производить над этими данными. Вот тогда можно
>получить буст.
>Если эти условия не выполняются, то использование SSE это однозначный фейл. Про
>это уже кучу раз на этом форуме говорили и приводили результаты тестированиq.
>Arbitrary code всегда работает быстрее без SSE.
Согласен. SSE и SSE2 для пакетной обработки данных.

>Как этот код по твоему живет в релизе при /Ox?
Не понял вопроса.

#50
16:09, 25 мар. 2009

asvp
Вставил твои SIN0 и COS0 в свою прогу. Работает правильно на всём заявленном диапазоне! (от 0 до 2 пи)
Далее приблизительно проверил скорость - ускорение раза в 2-3. Скорость проверял на глаз, лень было. =)
Возможно, тут сыграл роль процессор и настройки компилятора GCC. Процессор - Duron 1300, а, что более важно, компилятор компилил код для 486 оптимизированный.

Так что код пригодился, спасибо.

#51
16:14, 25 мар. 2009

asvp

>Не понял вопроса.
Ну, в общем, я все сделал честно. Почему не ругается компилятор я не знаю.
Вот код, который компилится без варнинга на vc90:

#include <stdio.h>

inline double fpu_cos(const double a)
{
  __asm
  {
    fld a
    fcos
  }
}

int main(int argc, char** argv)
{
  double angle = 0.5;
  double cosine = fpu_cos(angle);

  printf("%f", cosine);

  return 0;
}

#52
16:22, 25 мар. 2009

sb3d
>asvp
>Вставил твои SIN0 и COS0 в свою прогу. Работает правильно на всём заявленном
>диапазоне! (от 0 до 2 пи)
>Далее приблизительно проверил скорость - ускорение раза в 2-3. Скорость
>проверял на глаз, лень было. =)
>Возможно, тут сыграл роль процессор и настройки компилятора GCC. Процессор -
>Duron 1300, а, что более важно, компилятор компилил код для 486
>оптимизированный.
>Так что код пригодился, спасибо.
Я рад. Если понизить степень полиномов на 2-3 порядка. Ты получишь еще быстрые функции с погрешностью порядка от 10^-8 (степень 18) до 10^-11 (степень 22).
И с процессором все верно. Он одноядерный. На нем точнее результаты тестов можно получить. Да и архитектура проца другая.
И диапазон он -2PI до 2PI.

#53
16:25, 25 мар. 2009

Извиняюсь за тупорылый вопрос, а где вы в math.h видели fsincos?
Часто нужно посчитать sin и cos для угла. Знаю, что в x86 есть инструкция sincos.
Но как заюзать это на Си, не делая ассемблерных вставок?

Ghost2
Подскажи, плиз, если инлайнить функции с асмом, это убивает оптимайзинг компилятора?

#54
16:27, 25 мар. 2009

Ghost2
>Ну, в общем, я все сделал честно. Почему не ругается компилятор я не знаю.
С виду все верно. Почему не ругается - не знаю. Попробуй откомпилить с уровнем 4 предуждений.
Intel C++ требователен (даже через чур) к такого рода фишкам.

#55
16:35, 25 мар. 2009

Kroll
>Извиняюсь за тупорылый вопрос, а где вы в math.h видели fsincos?
>Часто нужно посчитать sin и cos для угла. Знаю, что в x86 есть инструкция
>sincos.
Я использую комилятор Intel C++. Там куча всяких полезных функции, которых нет в стандартном MSVC. Там и есть функция SINCOS.
Причем они разные:
-для float, double, long double
-для радианов и градусов.
>Но как заюзать это на Си, не делая ассемблерных вставок?
Написать свою.

>Подскажи, плиз, если инлайнить функции с асмом, это убивает оптимайзинг
>компилятора?
Не всегда. Но ухудшает.

#56
16:37, 25 мар. 2009

asvp

>Попробуй откомпилить с уровнем 4 предуждений.
Первое что попробовал. Этого варнинга небыло.

Kroll

>Подскажи, плиз, если инлайнить функции с асмом, это убивает оптимайзинг компилятора?
Функцию с асмом компилятор трогать не будет- он вставит ее как есть. Так что убить что-то можешь только ты сам.

#57
17:00, 25 мар. 2009

Ghost2
Ничего я убивать не собираюсь.
Имелось ввиду код До вставки и После.

#58
15:50, 27 мар. 2009

По последним тестам оказывается вычисления FPU выполняются точнее, чем SSE или SSE2

#59
17:17, 27 мар. 2009

asvp
На SSE с полиномами Чебышева разницы с FPU ноль на диапазоне [-2PI..2PI], при разнице в производительности в
несколько раз, а вот дальше да, точность расчётов на SSE по сравнению с FPU начинает падать, за счёт более
точных внутренних расчётов на FPU (80 бит) при преобразовании угла в диапазон [0..PI/2].
Реально от SSE заметный общий прирост производительности можно заметить только на групповых операцих.
В одном из проектов я оптимизировал на SSE расчёт динамической текстуры (для шейдера воды) с суммами гармоник
колебаний воды, прирост был весьма заметный по сравнению с FPU версий. Для одиночных операций, типа расчёта
матрицы/кватерниона вращения YawPitchRoll пару раз за кадр, парится с расчётом sin/соs/и т.п. на SSE IMHO не стоит.

Страницы: 1 2 3 4 5 6 Следующая »
ПрограммированиеФорумОбщее

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