Поддержка с плавающей точкой в ​​64-битном компиляторе - PullRequest
10 голосов
/ 31 октября 2010

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

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

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

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

Ответы [ 6 ]

5 голосов
/ 06 сентября 2011

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

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

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

3 голосов
/ 01 ноября 2010

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

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

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

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

3 голосов
/ 31 октября 2010

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

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

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

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

2 голосов
/ 17 марта 2011

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

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

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

2 голосов
/ 31 октября 2010

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

Прочитать аккаунт Аллена Бауэра в Twitter Kylix_rd:

http://twitter.com/kylix_rd

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

1 голос
/ 13 сентября 2011

Если вам это действительно нужно, тогда вы можете использовать TExtendedX87 unit by Philipp M. Schlüter ( PhiS на SO ), как указано в эта ветка форума Embarcadero .

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

...