Что подразумевается под "ремонтом" поплавков?

Я просматривал набор инструкций в AVX-512 и заметил набор fixup инструкции. Некоторые примеры:

_mm512_fixupimm_pd, 
_mm512_mask_fixupimm_pd, 
_mm512_maskz_fixupimm_pd

_mm512_fixupimm_round_pd, 
_mm512_mask_fixupimm_round_pd, 
_mm512_maskz_fixupimm_round_pd

Что подразумевается здесь под "починкой"?

2 ответа

Решение

Это отличный вопрос. Ответ Intel (мой жирный) здесь:

Эта инструкция специально предназначена для использования при исправлении результатов арифметических вычислений с использованием одного источника таким образом, чтобы они соответствовали спецификации, хотя в целом она полезна для исправления результатов последовательностей из нескольких команд, чтобы отразить ввод специальных чисел. Например, рассмотрим rcp(0). Введите 0 в rcp, и вы должны получить INF в соответствии со спецификацией DX10. Однако оценка rcp через Ньютона-Рафсона, где x= приблизительно (1/0), дает неверный результат. Чтобы справиться с этим, VFIXUPIMMPS может использоваться после обратной последовательности NR, чтобы установить для результата правильное значение (т. Е. INF, когда вход равен 0).

Ищите VFIXUPIMMPD в:

https://software.intel.com/sites/default/files/managed/0d/53/319433-022.pdf

Описание Intel в их руководстве по набору инструкций "Будущие расширения" имеет обычный Operation раздел, который полностью определяет, какие биты идут куда.

Intrinsics Guide также воспроизводит Operation раздел, который является хорошим изменением от некоторых других плохо документированных записей в руководстве по встроенным функциям. Или, может быть, это недавнее дополнение. Это все еще опускает таблицы и диаграммы. Я обычно нахожу руководство по insn ref более полезным, за исключением случаев, когда я ищу инструкции, о которых я, возможно, не думал и не знал.

Раздел "Операция" для этой инструкции длинен и труден для понимания, а описание на английском языке представляет собой лишь грубое резюме:

Выполните исправление элементов с четырьмя словами, закодированных в формате с плавающей запятой двойной точности в первом исходном операнде (втором операнде), используя 32-разрядную двухуровневую справочную таблицу, указанную в соответствующем элементе двойного слова второго исходный операнд (третий операнд) со спецификатором сообщения об исключении imm8

...

Двухуровневая справочная таблица выполняет исправление всех входных данных DP FP в первом операнде-источнике путем декодирования кодирования входных данных в 8 типов токенов. Таблица ответов определяется для каждого типа токена, который преобразует входную кодировку в первый операнд источника с одним из 16 действий ответа.

Предполагаемый вариант использования:

  • dest = результат rcppd (или аналогичный) + итерация Ньютона-Рафсона
  • src= вход в приближение + уточнение
  • таблица = таблица исправлений. Может быть операндом широковещательной памяти, поэтому в общем случае требуется только 64 или 32 бита памяти, когда вам нужна одна и та же таблица для каждого элемента вектора. (Таблица только 32 b для одинарной и двойной точности, но широковещательный вариант версии DP - m64bcst. Допустимо, что старшие 32 бита этого мусора, но не для того, чтобы пересекать границу страницы в не отображенную страницу: возможно вина.)

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

Для каждого элемента src:

  • tsrc = сбрасывать денормалы в ноль, если MXCSR.DAZ установлено. Оригинальный src вообще не используется после этого: нет dest=src только действие dest=tsrc,

  • классифицировать tsrc как один из восьми типов "токенов" (QNAN, SNAN, ноль, +1, -Inf, +Inf, отрицательное значение, положительное значение). Если imm8 отличен от нуля, исключения будут вызваны, когда найден токен соответствующего типа.

  • Используйте этот токен категории для поиска действия в соответствующем элементе 3-го операнда (который представляет собой таблицу из восьми 4-битных кодов, по одному для каждого токена).

  • Действие может быть одним из: dest=dest, dest=tsrc, dest=NaN, dest=+/-Inf, dest=Inf со знаком tsrc, dest=+/-0, dest=+/-1, dest=1/2, dest=90.0, dest=pi/2 или dest=MAX/MIN_FLOAT. Посмотрите документы Intel, для которых код соответствует какому действию.

Этот процесс выполняется отдельно для каждого элемента вектора.

Типичное использование будет положить dest=dest код для всех случаев, когда результаты, которые мы исправляем, уже будут правильными. Обратите внимание, что dest также является входным операндом, даже без маски записи, из-за dest=dest действие.

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