Стек x87 FP все еще актуален?

Я заметил, что компиляторы генерируют код, который нацелен на регистры SIMD каждый раз double арифметика используется. Это относится как к неоптимизированному, так и к оптимизированному коду. Означает ли это, что модуль x87 FP можно считать устаревшим и представлен только для обратной совместимости?

Я также заметил, что другие "популярные" платформы также полагаются на соответствующие реализации SIMD, а не на FP, спроектированные как стек.

Также реализации SIMD имеют тенденцию иметь ширину не менее 128 бит, поэтому мне интересно, означает ли это, что (внутренняя) точность операций выше, чем для модуля x87 FP?

Я также интересуюсь производительностью, пропускной способностью и задержкой, учитывая, что SIMD был задуман с учетом векторного исполнения, поэтому мне интересно, как они работают со скалярами.

1 ответ

Решение

Также реализации SIMD имеют тенденцию иметь ширину не менее 128 бит, поэтому мне интересно, означает ли это, что (внутренняя) точность операций выше, чем для модуля x87 FP?

Ширина регистра SIMD не является шириной одного отдельного компонента вектора, который он представляет. Широко доступные наборы инструкций SIMD предлагают не более IEEE 754 формата binary64 (64-битная ширина). Это не так хорошо, как исторический расширенный 80-битный формат для точности или диапазона.

Многие компиляторы C делают 80-битный формат доступным как long double тип. Я использую это часто. Это полезно для большинства промежуточных вычислений: использование этого помогает сделать конечный результат более точным, даже если конечный результат предназначен для возврата в виде двоичного кода64 double, Одним из примеров является функция в этом вопросе, для которой математически интуитивное свойство сохраняет конечный результат, если промежуточные вычисления выполняются с long double, но не если промежуточные вычисления выполняются с тем же double введите в качестве входов и выходов.

Точно так же среди многих ограничений, которые должны были быть сбалансированы при выборе параметров для расширенного 80-битного формата, одно соображение заключается в том, что идеально подходит для вычисления функции binary64. pow() сочиняя 80-битный expl() а также logl(), Дополнительная точность необходима для получения хорошей точности конечного результата.

Следует отметить, однако, что когда "промежуточные" вычисления являются единственной базовой операцией, лучше не проходить через расширенную точность. Другими словами, когда x а также y имеют тип doubleТочность (double)(x * (long double)y) очень немного хуже, чем точность x * y, Два выражения почти всегда дают одинаковые результаты, и в редких случаях, когда они различаются, x * y очень немного точнее. Это явление называется двойным округлением.

Другие вопросы по тегам