Прошу помощи и совета!Простая программа на C - два вложенных цикла, формируется матрица NxN из синусов и косинусов. Всё просто, но мне надо проводить вычисления с long double, соответственно
использую sinl() и cosl()Программа компилировалась g++ и icpc, для двух случаев double и long double.
| double long double
-----|-----------------------------
g++ | 11сек 12 сек
icpc | 3сек 23 секНаблюдается резкое падение скорости для long double в случае использования icpc.
При компиляции icpc использовались ключи -fast -march=core2 и библиотека mathimf.
Подскажите пожалуйста, где ошибка? Как уменьшить 23 сек.
С уважением
Дмитрий
>Наблюдается резкое падение скорости для long double в случае использования icpc.
>Подскажите пожалуйста, где ошибка?Ошибки нет. Это на самом деле сильно медленнее, так устроенны процессоры.
>Как уменьшить 23 сек.Отказатся от long double
В gcc наверняка long double = double
>В gcc наверняка long double = doubleЭто не так, но ситуация неочевидна. Похоже, зависит это от конкретного FPU.
У меня на 2 машинах i386/amd64 с одинаковым gcc (gcc version 4.2.1 20070719 [FreeBSD]):i386 (pentium4): sizeof(long double) = 12, на деле используется 15 бит мантисса, но 52 бит экспонента (как в обычном double). Младшие 12 бит экспоненты - нули.
amd64 (core2duo): sizeof(long double) = 16, на деле используется 15 бит мантисса и 64 бит экспонента, как положено.Скорости лень считать.
В любом случае, если нужно что-то точнее double, имеет смысл использовать готовые библиотеки для вычислений с произвольной точностью.