Поддержка чисел с плавающей запятой в 64-битном компиляторе

Чего нам ожидать от поддержки плавающей запятой в 64-битном компиляторе Delphi?

  • Будет ли 64-битный компилятор использовать SSE для реализации арифметики с плавающей запятой?

  • Будет ли 64-битный компилятор поддерживать текущий 80-битный тип с плавающей запятой (расширенный)?

Эти вопросы тесно связаны, поэтому я задаю их как один вопрос.


person kludg    schedule 31.10.2010    source источник
comment
Я знаю, что читал об этом, но точно не помню, где.   -  person Andreas Rejbrand    schedule 31.10.2010
comment
@gbrandt: Значит, каждый новый вопрос, касающийся 64-битной версии Delphi, следует закрывать как точный дубликат?   -  person Andreas Rejbrand    schedule 01.11.2010
comment
Я должен сказать, что если бы поддержка 80-битных значений с плавающей запятой была прекращена, это было бы для меня ОЧЕНЬ плохой новостью. И это может вызвать всевозможные головные боли у людей, даже если им на самом деле не нужна эта точность, потому что программы (числовые результаты) могут вести себя по-разному в 32-битных и 64-битных программах.   -  person PhiS    schedule 01.11.2010


Ответы (6)


Для двойного = расширенного бита:

Прочитайте Твиттер-аккаунт ALLen Bauer Kylix_rd:

http://twitter.com/kylix_rd

Оглядываясь назад, логично, потому что, хотя регистры SSE2 128-битные, они используются как два 64-битных двойника.

person Marco van de Voort    schedule 31.10.2010
comment
Но это то же самое, что и с другими типами, которые не подходят для регистров: соглашение о вызовах позволяет передавать их по ссылке. - person PhiS; 01.11.2010
comment
Целые числа обычно имеют один тип с более высокой точностью, чем у ALU. (32-битный -> int64, 64-битный -> int128), это связано с некоторыми свойствами целых чисел. Однако это обычно не относится к плавающей запятой. Процессор x87 поддерживает расширенный как самый высокий уровень, но Delphi не поддерживает ничего большего. Пока передача по ссылке (например, как запись с двумя дублями) работает, это решает только перекачку данных. Не делайте расчетов, которые будут плавными и очень медленными. Имейте в виду, что Int64 частично ускоряется процессором. - person Marco van de Voort; 30.12.2011

Я сделал два сообщения на эту тему (здесь и здесь), подытоживая, да, 64-битный компилятор использует SSE2 (двойную точность), но не использует SSE (одинарную точность). Все преобразуется в числа с двойной точностью и вычисляется с использованием SSE2 (редактировать: однако есть возможность управлять этим)

Это означает ф.и. что если математика с плавающей запятой двойной точности выполняется быстро, математика с одинарной точностью выполняется медленно (добавляется множество избыточных преобразований между одинарной и двойной точностью), «расширенный» имеет псевдоним «двойной», а промежуточная точность вычислений ограничена двойной точностью .

Изменить: существовала недокументированная (в то время) директива, управляющая генерацией кода SSE, {$EXCESSPRECISION OFF} активирует генерацию кода SSE, что возвращает производительность в соответствие с ожиданиями.

person Eric Grange    schedule 06.09.2011

По словам Марко ван де Воорта в его ответе на: Как мне подготовить мои 32-битные программы Delphi для возможного 64-битного компилятора:

x87 FPU устарел на x64, и в целом SSE2 будет использоваться для точки флорирования. поэтому плавающая запятая и ее обработка исключений могут работать немного по-другому, а расширенный может быть не 80-битным (а 64-битным или, что менее вероятно, 128-битным). Это также относится к обычным изменениям округления (copro controlwork) при взаимодействии с кодом C, который ожидает другое слово fpu.

PH прокомментировал этот ответ следующим образом:

Я бы не сказал, что x87 FPU устарел, но это, безусловно, тот случай, когда Microsoft решила сделать все возможное, чтобы сделать его таким (и им действительно не нравятся 80-битные значения FP), хотя это явно технически возможно использовать FPU/80-битные числа с плавающей запятой на Win64.

person lkessler    schedule 31.10.2010
comment
Первоначально FPU устарела MS на x86_64 (XP64), и, по правде говоря, его контекст даже не сохранялся в начальных версиях XP64. Это было исправлено позже, но по-прежнему не рекомендуется. - person Marco van de Voort; 31.10.2010
comment
@Marco - обратите внимание, однако, что некоторые компиляторы (например, компилятор Intel C++) могут создавать код для x87 FPU на x64. Кроме того, Microsoft Macro Assembler для 64-разрядных систем поддерживает набор инструкций FPU. Таким образом, кажется, что Microsoft не хочет код x87, если они могут его избежать (например, VC++), но ОС поддерживает его. - person PhiS; 01.11.2010
comment
Это afaik устарело в API x86_64. Вероятно, его планируется вывести на пенсию, когда 32-разрядные ОС (и приложения?) действительно исчезнут. - person Marco van de Voort; 01.11.2010
comment
@Marco - Хм, я настроен скептически; посмотрим. Есть ли на самом деле случай, когда Win32 API использует 80-битные числа с плавающей запятой (без учета возвращаемых значений в ST (0), которые являются такими, какими вы хотите их видеть)? Если нет, то тому же API явно незачем заморачиваться с x87 FPU на x64, где у вас как минимум SSE2. (Но это не означает, что программа не может использовать x87 внутри.) - person PhiS; 01.11.2010
comment
На самом деле нет, так как Windows NT должна была быть переносимой и поддерживать другие цели (sparc, powerpc и IA64), которые не поддерживали расширенные версии. - person Marco van de Voort; 30.12.2011

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

Очевидно, что никто, кроме Embarcadero, не может ответить на этот вопрос точно до выхода продукта.

Весьма вероятно, что любой приличный компилятор x64 будет использовать набор инструкций SSE2 в качестве основы и, следовательно, попытается выполнить как можно больше вычислений с плавающей запятой с использованием функций SSE, сводя к минимуму использование x87 FPU. Тем не менее, следует также сказать, что нет технической причины, препятствующей использованию x87 FPU в коде приложения x64 (несмотря на слухи об обратном, которые ходили некоторое время; если вам нужна дополнительная информация по этому вопросу, пожалуйста, посмотрите Руководство Agner Fog по соглашению о вызовах, в частности главу 6.1 "Могут ли регистры с плавающей запятой быть используется в 64-битной Windows?").

Изменить 1: Delphi XE2 Win64 действительно не поддерживает 80-битные вычисления с плавающей запятой из коробки (см., например, обсуждение здесь (хотя он позволяет читать/записывать такие значения). Такие возможности можно вернуть в Delphi Win64 с помощью операторов записи + класса, как это делается в этом типе TExtendedX87 (хотя применяются оговорки).

person PhiS    schedule 01.11.2010

Мы не будем знать наверняка, как 64-битный компилятор Delphi будет реализовывать арифметику с плавающей запятой, пока Embarcadero не выпустит его. Все, что было до этого — просто предположения. Но как только мы узнаем наверняка, будет слишком поздно что-то с этим делать.

Твиты Аллена Бауэра, кажется, указывают на то, что они будут использовать SSE2 и что расширенный тип может быть уменьшен до 64 бит вместо 80 бит. Я думаю, что это было бы плохой идеей по целому ряду причин. Я изложил свои мысли в отчете QualityCentral Extended должен оставаться 80-битным типом. на 64-битных платформах

Если вы не хотите, чтобы точность вашего кода снизилась с 80-битной до 64-битной при переходе на 64-битную версию Delphi, щелкните ссылку QualityCentral и проголосуйте за мой отчет. Чем больше голосов, тем больше шансов, что Embarcadero прислушается. Если они используют SSE2 для 64-битных операций с плавающей запятой, что имеет смысл, то добавление 80-битных операций с плавающей запятой с использованием FPU потребует от Embarcadero дополнительной работы. Я сомневаюсь, что они сделают эту работу, если об этом не попросят многие разработчики.

person Jan Goyvaerts    schedule 17.03.2011
comment
Спасибо за отчет QC, очень признателен. - person PhiS; 18.03.2011

Если вам это действительно нужно, вы можете использовать модуль TExtendedX87 от Филипп М. Шлютер (PhiS на SO), как указано в этой ветке форума Embarcadero.

@PhiS: когда вы обновите свой ответ информацией из моего, я удалю свой.

person Jeroen Wiert Pluimers    schedule 13.09.2011
comment
Спасибо Jeroen - я добавил указатель на модуль в надежде, что это будет полезно. - person PhiS; 16.09.2011