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

StackOverflow https://stackoverflow.com/questions/4064189

  •  27-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Для бита double=extended:

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

http://twitter.com/kylix_rd

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Если вам это действительно нужно, то вы можете использовать Расширенный блок X87 к Филипп М.Шлютер (ФиС на СО), как указано в эта ветка форума Embarcadero.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top