2015-05-13 4 views
6

Я просматривал инструкцию в AVX-512 и замечал набор команд fixup. Некоторые examples:Что подразумевается под «исправлением» поплавков?

_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 

Что здесь имеется в виду под «подправить»?

ответ

4

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

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

Посмотрите на VFIXUPIMMPD в: Описание

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

+0

Это намного более подробно, чем их онлайн-документация, спасибо за ссылку! –

+0

Это все еще довольно мусорное пособие, если вы спросите меня. Не до нормального качества письма. Если бы у меня была поддержка процессора AVX-512, я бы отложил ее и посмотрел, что на самом деле происходит;) – JCx

+1

@JCx: Я думаю, что описание псевдокода о том, что он делает, достаточно детально (раздел 'Operation'). В приведенном вами параграфе приводится пример использования, а не информация о работе. Описание: для каждого элемента src классифицируйте его как один из восьми типов «токенов». Используйте этот токен для поиска действия в соответствующем элементе 3-го операнда (который представляет собой таблицу из восьми 4-битных кодов). Действие может установить dest = dest, dest = src, dest = NaN, dest = +/- Inf, dest = +/- 0, dest = pi/2 или несколько других вещей. Обратите внимание, что dest также является входным операндом, даже без файла writemask. –

2

Intel в их "future extensions" instruction set reference manual имеет обычную Operation секцию, которая полностью определяет, какие биты идут туда, где.

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

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

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

...

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

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

  • Dest = результат rcppd (или аналогичного) + Ньютон-Рафсона итерационного
  • SRC = входа в приближение + уточнение
  • таблица = FixUp Таблица. Может быть оператором памяти широковещательной передачи, поэтому в общем случае требуется только 64 или 32 бит памяти, где вам нужна одна и та же таблица для каждого элемента вектора. (Таблица представляет собой только 32b для одиночной и двойной точности, но опция широковещательной передачи 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.