Расширенная (80-разрядная) двойная плавающая точка в x87, не SSE2 - мы не пропускаем его?

Я читал сегодня об исследователях, обнаруживающих, что библиотеки Phys-X Nvidia используют x87 FP по сравнению с SSE2. Очевидно, это будет субоптимальным для параллельных наборов данных, где скорость превосходит точность. Однако автор статьи продолжает заключать в кавычки:

Intel начал препятствовать использованию x87 с введением P4 в конце 2000 года. AMD удержал от использования x87 начиная с K8 в 2003, когда x86-64 определяется с поддержкой SSE2; C7 VIA поддерживал SSE2 с 2005. В 64-разрядных версиях Windows x87 удерживается от использования для непривилегированного режима и запрещается полностью в привилегированном режиме. В значительной степени все в промышленности рекомендовали SSE по x87 с 2005 и нет никаких причин использовать x87, если программное обеспечение не должно работать на встроенном Pentium или 486.

Я задался вопросом об этом. Я знаю, что x87 использует 80-разрядный расширенный, удваивается внутренне для вычислений значений, и SSE2 не делает. Разве это не имеет значения ни для кого? Это кажется удивительным мне. Я знаю, когда я делаю вычисления на точках, строках и полигонах в плоскости, значения могут быть удивительно неправильными при выполнении вычитаний, и области могут выйти из строя, и строки искажают друг друга из-за отсутствия точности. Используя 80-разрядные значения по сравнению с 64-разрядными значениями мог помочь, я воображу.

Действительно ли это неправильно? В противном случае, что мы можем использовать для выполнения расширенных двойных операций FP, если x87 постепенно сокращен?

35
задан codekaizen 8 July 2010 в 16:57
поделиться

1 ответ

Самая большая проблема с x87 в том, что все операции с регистрами выполняются в 80 битах, тогда как в большинстве случаев люди используют только 64-битные поплавки (т.е. поплавки двойной точности). Происходит следующее: вы загружаете в стек x87 64-битное плавающее число, и оно преобразуется в 80 бит. Вы выполняете некоторые операции с ним в 80 битах, затем сохраняете его обратно в память, преобразуя в 64 бита. Вы получите другой результат, чем если бы вы выполнили все операции только с 64 битами, а при оптимизирующем компиляторе может быть очень непредсказуемо, через сколько преобразований может пройти значение, поэтому трудно проверить, что вы получаете "правильный" ответ при выполнении регрессионных тестов.

Другая проблема, которая имеет значение только с точки зрения того, кто пишет ассемблер (или косвенно пишет ассемблер, в случае если кто-то пишет генератор кода для компилятора), заключается в том, что x87 использует стек регистров, тогда как SSE использует индивидуально доступные регистры. В x87 у вас есть куча дополнительных инструкций для работы со стеком, и я представляю, что Intel и AMD предпочли бы заставить свои процессоры работать быстро с кодом SSE, чем пытаться заставить работать быстро эти дополнительные инструкции x87 для работы со стеком.

BTW Если у вас проблемы с неточностью, вам стоит взглянуть на статью "Что каждый программист должен знать об арифметике с плавающей точкой", а затем, возможно, использовать математическую библиотеку произвольной точности (например, GMP).

25
ответ дан 27 November 2019 в 15:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: