glibc и математические функции.
От: alpha21264 СССР  
Дата: 23.10.15 09:35
Оценка:
Разбираюсь тут с библиотекой glibc. Вот этой:
https://www.gnu.org/software/libc/download.html
Работа связана с тем, что нужно водрузить эту библиотеку на отечественный процессор.
Обнаружилась странная вещь.
В библиотеке есть математические функции — синусы и логарифмы и прочее.
Для i386 и тому подобного эти функции реализованы на ассемблере (что нормально).
Для других архитектур есть некая замена, написанная на С.
Функции разные для разных аргументов. Для коротких (32-битных) float и для длинных (64-битных) double.
Так вот... для 32-битных float функции реализованы на многочленах, использующих float (и это нормально).
Исходники лежат здесь: (корень)/sysdeps/ieee754/flt-32
А для 64-битных double... на целых числах!!!
Исходники лежат здесь: (корень)/sysdeps/ieee754/dbl-64
Соответсвенно скорость падает в СТО раз.

Это вообще нормально, или я что-то пропустил?

Течёт вода Кубань-реки куда велят большевики.
Re: glibc и математические функции.
От: citrin Россия http://citrin.ru/
Дата: 23.10.15 11:09
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>А для 64-битных double... на целых числах!!!

A>Исходники лежат здесь: (корень)/sysdeps/ieee754/dbl-64
A>Соответсвенно скорость падает в СТО раз.

1. Стоит почитать коммит логи. Возможно там есть объяснение.
Например не исключено что в другом варианте будет теряться точность.

Вообще вычисления математических функций с высокой точностью очень сложная задача с кучей не очевидных моментов.
Re: glibc и математические функции.
От: vsb Казахстан  
Дата: 23.10.15 12:02
Оценка:
Здравствуйте, alpha21264, Вы писали:


A>Разбираюсь тут с библиотекой glibc. Вот этой:

A>https://www.gnu.org/software/libc/download.html
A>Работа связана с тем, что нужно водрузить эту библиотеку на отечественный процессор.
A>Обнаружилась странная вещь.
A>В библиотеке есть математические функции — синусы и логарифмы и прочее.
A>Для i386 и тому подобного эти функции реализованы на ассемблере (что нормально).
A>Для других архитектур есть некая замена, написанная на С.
A>Функции разные для разных аргументов. Для коротких (32-битных) float и для длинных (64-битных) double.
A>Так вот... для 32-битных float функции реализованы на многочленах, использующих float (и это нормально).
A>Исходники лежат здесь: (корень)/sysdeps/ieee754/flt-32
A>А для 64-битных double... на целых числах!!!
A>Исходники лежат здесь: (корень)/sysdeps/ieee754/dbl-64
A>Соответсвенно скорость падает в СТО раз.

A>Это вообще нормально, или я что-то пропустил?


А gcc в оптимизированном режиме случайно не заменяет эти функции своими вызовами?
Re[2]: glibc и математические функции.
От: alpha21264 СССР  
Дата: 23.10.15 14:14
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>Здравствуйте, alpha21264, Вы писали:



A>>Разбираюсь тут с библиотекой glibc. Вот этой:

A>>А для 64-битных double... на целых числах!!!
A>>Исходники лежат здесь: (корень)/sysdeps/ieee754/dbl-64
A>>Соответсвенно скорость падает в СТО раз.

A>>Это вообще нормально, или я что-то пропустил?


vsb>А gcc в оптимизированном режиме случайно не заменяет эти функции своими вызовами?


Нуу... понимаешь... gcc-то для этого процессора тоже мы пишем.
Нет, не подменяет. Да и не должен. Это же функции.
Как компилятору знать, что делают эти функции и на что их менять?

Течёт вода Кубань-реки куда велят большевики.
Re[3]: glibc и математические функции.
От: vsb Казахстан  
Дата: 23.10.15 14:22
Оценка:
Здравствуйте, alpha21264, Вы писали:

vsb>>А gcc в оптимизированном режиме случайно не заменяет эти функции своими вызовами?


A>Нуу... понимаешь... gcc-то для этого процессора тоже мы пишем.

A>Нет, не подменяет. Да и не должен. Это же функции.
A>Как компилятору знать, что делают эти функции и на что их менять?

Есть стандартные функции и при их использовании компилятор часто вставляет не вызов функции, а какой-то другой код или вызов другой функции. Например puts вместро printf("bla\n") или свою реализацию вместо вызова memcpy.

Впрочем синус он вроде не заменяет, так что в данном случае это не то.
Отредактировано 23.10.2015 14:32 vsb . Предыдущая версия .
Re: glibc и математические функции.
От: smeeld  
Дата: 23.10.15 14:37
Оценка: +1
Здравствуйте, alpha21264, Вы писали:


A>Функции разные для разных аргументов. Для коротких (32-битных) float и для длинных (64-битных) double.

A>Так вот... для 32-битных float функции реализованы на многочленах, использующих float (и это нормально).

A>А для 64-битных double... на целых числах!!!


A>Соответсвенно скорость падает в СТО раз.


С чего это падает?
Re[2]: glibc и математические функции.
От: alpha21264 СССР  
Дата: 23.10.15 15:02
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, alpha21264, Вы писали:



A>>Функции разные для разных аргументов. Для коротких (32-битных) float и для длинных (64-битных) double.

A>>Так вот... для 32-битных float функции реализованы на многочленах, использующих float (и это нормально).

A>>А для 64-битных double... на целых числах!!!


A>>Соответсвенно скорость падает в СТО раз.


S>С чего это падает?


Ну посмотри файл
/sysdeps/ieee754/dbl-64/e_atan2.c
Это может быстро работать?

Течёт вода Кубань-реки куда велят большевики.
Re: glibc и математические функции.
От: Zhendos  
Дата: 23.10.15 18:53
Оценка:
Здравствуйте, alpha21264, Вы писали:


A>Разбираюсь тут с библиотекой glibc. Вот этой:

A>Так вот... для 32-битных float функции реализованы на многочленах, использующих float (и это нормально).
A>Исходники лежат здесь: (корень)/sysdeps/ieee754/flt-32
A>А для 64-битных double... на целых числах!!!
A>Исходники лежат здесь: (корень)/sysdeps/ieee754/dbl-64
A>Соответсвенно скорость падает в СТО раз.
A>Это вообще нормально, или я что-то пропустил?

А можно конкретный пример что именно реализовано на "целых" числах?

Например sysdeps/ieee754/dbl-64/e_atan2.c:
double
SECTION
__ieee754_atan2 (double y, double x)
{
  int i, de, ux, dx, uy, dy;
  static const int pr[MM] = { 6, 8, 10, 20, 32 };
  double ax, ay, u, du, u9, ua, v, vv, dv, t1, t2, t3, t7, t8,
     z, zz, cor, s1, ss1, s2, ss2;


явно не только целые числа использует
Re[3]: glibc и математические функции.
От: smeeld  
Дата: 23.10.15 19:38
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Это может быстро работать?


В упор не вижу проблемы, все вычисления тут
Re[4]: glibc и математические функции.
От: alpha21264 СССР  
Дата: 23.10.15 22:16
Оценка:
Здравствуйте, smeeld, Вы писали:

S>Здравствуйте, alpha21264, Вы писали:


A>>Это может быстро работать?


S>В упор не вижу проблемы, все вычисления тут


Ну, вероятно у тебя что-то со зрением.
Это что-то выражается в том, что ты глядя на код не можешь прикинуть, какая производительность получится.
Получается в сто раз меньше, чем у flt-32. Ну это просто результат эксперимента такой.

А вот эти строчки видел? Они тебя не смущают?
 493       if ((z = s1 + (ss1 - uc.d)) == s1 + (ss1 + uc.d))
 494         return signArctan2 (y, z);
 495       return atan2Mp (x, y, pr);

Течёт вода Кубань-реки куда велят большевики.
Re[5]: glibc и математические функции.
От: smeeld  
Дата: 23.10.15 22:47
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>А вот эти строчки видел? Они тебя не смущают?

A>
A> 493       if ((z = s1 + (ss1 - uc.d)) == s1 + (ss1 + uc.d))
A> 494         return signArctan2 (y, z);
A> 495       return atan2Mp (x, y, pr);
A>


Нет, ничего, что бы снизило производительность в сто раз тут нет.
Re[2]: glibc и математические функции.
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 24.10.15 06:57
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>А gcc в оптимизированном режиме случайно не заменяет эти функции своими вызовами?


Как минимум на x86-64 (aka amd64) в SSE* команд нет, используются эти функции.
Для x86-32 aka i386 дёргается FPU, если точности хватает, иначе краевые случаи отрабатываются своими средствами. На fast-math режиме могут многое сократить, например, делать pow() через FPU.
The God is real, unless declared integer.
Re[3]: glibc и математические функции.
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.10.15 14:53
Оценка:
Здравствуйте, alpha21264, Вы писали:

A>Нуу... понимаешь... gcc-то для этого процессора тоже мы пишем.

A>Нет, не подменяет. Да и не должен. Это же функции.
A>Как компилятору знать, что делают эти функции и на что их менять?

Про некоторые функции он таки много чего знает. Например, он умеет заменять printf() на puts() там, где уместно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.