Подтвердить что ты не робот

Преимущества x87 над SSE

Я знаю, что x87 имеет более высокую внутреннюю точность, что, вероятно, является самой большой разницей, которую люди видят между ней и SSE-операциями. Но я должен удивляться, есть ли другая польза для использования x87? У меня есть привычка печатать -mfpmath=sse автоматически в любом проекте, и мне интересно, не хватает ли я чего-нибудь еще, что предлагает x90 FPU.

4b9b3361

Ответ 1

Для рукописного asm в x87 есть некоторые инструкции, которых нет в наборе инструкций SSE.

Вдобавок ко всему, это все тригонометрические вещи, такие как fsin, fcos, fatan, fatan2 и некоторые экспоненциальные/логарифмированные вещи.

С gcc -O3 -ffast-math -mfpmath=387, GCC9 все еще будет фактически встроенным sin(x) как инструкция fsin, независимо от того, что использовала бы реализация в libm. (https://godbolt.org/z/Euc5gp).

MSVC вызывает __libm_sse2_sin_precise при компиляции для 32-битного x86.


Если ваш код тратит большую часть времени на выполнение тригонометрии, вы можете увидеть небольшой выигрыш в производительности или потерю при использовании x87, в зависимости от того, является ли ваша стандартная реализация математической библиотеки с использованием SSE1/SSE2 быстрее или медленнее, чем медленный микрокод для fsin на любом процессоре вы используете.

Производители процессоров не прикладывают больших усилий для оптимизации микрокода для инструкций x87 в новейших поколениях процессоров, потому что они обычно считаются устаревшими и используются редко. (Посмотрите на количество uop и пропускную способность для сложных команд x87 в таблицах команд Agner Fog в процессорах последних поколений: больше циклов, чем в старых процессорах). Чем новее процессор, тем больше вероятность того, что x87 будет медленнее, чем многие инструкции SSE или AVX для вычисления функций log, exp, pow или trig.

Даже когда доступен x87, не все математические библиотеки предпочитают использовать сложные инструкции, такие как fsin, для реализации функций, таких как sin(), или особенно exp/log, где целочисленные приемы для манипулирования битовыми шаблонами FP на основе журнала полезны.

Некоторые алгоритмы DSP используют много триггеров, но обычно извлекают большую пользу из автоматической векторизации с математическими библиотеками SIMD.

Однако для математического кода, где вы проводите большую часть своего времени, делая сложения, умножения и т.д. SSE обычно быстрее.


Также связано: Intel недооценивает границы ошибок на 1,3 квинтиллиона - наихудший случай для fsin (катастрофическое аннулирование для входов fsin очень близко к пи) очень плохой. Программное обеспечение может работать лучше, но только с медленными методами расширенной точности.

Ответ 2

  • Он присутствует на действительно старых машинах.

EOF

Ответ 3

Инструкции FPU меньше, чем инструкции SSE, поэтому они идеально подходят для демонстрационного материала

Ответ 4

  • Существует значительная совместимость с x87 и совместимость с системой. SSE - относительно новая функция процессора. Если ваш код запускается на встроенном микроконтроллере, есть хороший шанс, что он не поддержит инструкции SSE.

  • Даже системы, которые не имеют установленного FPU, часто предоставляют эмуляторы 80x87, которые сделают код прозрачным (более или менее). Я не знаю никаких эмуляторов SSE - конечно, у одной из моих систем их нет, поэтому новые версии Adobe Photoshop не работают.

  • Инструкции 80x87 имеют хорошие параллельные рабочие характеристики, которые были тщательно изучены и проанализированы с момента его введения в 1982 году или около того. Различные клоны x86 могут останавливаться на инструкциях SSE.

Ответ 5

Конверсия между float и double выполняется быстрее с x87 (обычно свободным), чем с SSE. С помощью x87 вы можете загружать и хранить float, double или long double в стек регистров или из него, и он преобразуется в или из расширенной точности без дополнительных затрат. При использовании SSE для преобразования типов, если типы смешиваются, требуются дополнительные инструкции, поскольку регистры содержат значения float или double. Эти инструкции по преобразованию довольно быстры, но требуют дополнительного времени.

Реальное решение - воздержаться от чрезмерного смешивания float и double, а не использования x87, конечно.