URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 6998
[ Назад ]

Исходное сообщение
"Intel® C++ Compiler 10.1 for Linux"

Отправлено researcher2 , 01-Дек-07 15:11 
Прошу помощи и совета!

Простая программа на 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 сек.

С уважением
Дмитрий


Содержание

Сообщения в этом обсуждении
"Intel® C++ Compiler 10.1 for Linux"
Отправлено Аноним , 03-Дек-07 23:21 
>Наблюдается резкое падение скорости для long double в случае использования icpc.
>Подскажите пожалуйста, где ошибка?

Ошибки нет. Это на самом деле сильно медленнее, так устроенны процессоры.
>Как уменьшить 23 сек.

Отказатся от long double

В gcc наверняка long double = double


"Intel® C++ Compiler 10.1 for Linux"
Отправлено Аноним , 04-Дек-07 22:28 
>В 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, имеет смысл использовать готовые библиотеки для вычислений с произвольной точностью.