vgetmantps vs andpd инструкции по получению мантиссы с плавающей точкой - PullRequest
0 голосов
/ 10 сентября 2018

Для Skylakex (таблицы инструкций agner fog):

+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
|      Instruction      |  Operands   | µops fused domain | µops unfused domain | µops each port | Latency | Reciprocal throughput |
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+
| VGETMANTPS/PD         | v,v,v       |                 1 |                   1 | p01/05         |       4 | 0.5-1                 |
| AND/ANDN/OR/ XORPS/PD | x,x / y,y,y |                 1 |                   1 | p015           |       1 | 0.33                  |
+-----------------------+-------------+-------------------+---------------------+----------------+---------+-----------------------+

Означает ли это использование битовой маски и логики, и получить мантиссу с плавающей точкой быстрее, чем с помощью инструкции vgetmantps?

Сколько стоит задержка для перевода числа из числа с плавающей точкой в ​​int и обратно в число с плавающей точкой?

1 Ответ

0 голосов
/ 10 сентября 2018

Для реализации log(x) вы хотите мантисса и показатель степени как float, а vgetmantps / vgetexpps идеально подходят для этого. Эффективная реализация log2 (__m256d) в AVX2 .Это то, для чего предназначены эти инструкции, и они ускоряют быстрое приближение до log(2).(Кроме того, он может нормализовать значимое значение до -0,5 .. +0,5 вместо 0..1 или других аккуратных диапазонов, чтобы создать ввод для полиномиального приближения до log(x+1) или чего-либо другого. См. его документы .)

Если вы хотите, чтобы мантисса представляла собой целое число, то обязательно верните И другие биты, и вы закончите в одной инструкции.

(Но помните, что для NaN мантисса - это NaNполезная нагрузка, так что если вам нужно сделать что-то другое для NaN, то вам нужно проверить экспоненту.)

Сколько стоит задержка для перевода числа из float в int и обратно в float?

У вас уже есть таблицы команд Agner Fog (https://agner.org/optimize/). На Skylake (SKL и SKX) VCVT(T) PS2DQ - это задержка 4c для портов FMA, как и в другом направлении.

Или вы спрашиваете о задержке обхода для использования вывода инструкции FP, такой как andps, в качестве ввода целочисленной инструкции?

В микроархиве PDF Agner Fog есть некоторая информация о задержке обхода для отправки данных.между доменами vec-int и fp, но не так много специфики.

Задержка обхода Skylake странная: в отличие от предыдущих Uarches, это зависит от того, какой порт на самом деле выбрал команда.andps не имеет задержки обхода между командами FP, если она выполняется на порту 5, но если она работает на p0 или p1, она имеет дополнительный 1c задержки.

См. Руководство по оптимизации Intel для таблицы domain-пересекающиеся задержки с разбивкой по домену + порт выполнения.

(И, что еще более странно, эта задержка обхода задержки влияет на этот регистр навсегда, даже после того, как он определенно записан обратно в физический регистр и не являетсяпереадресация по обходной сети. vpaddd xmm0, xmm1, xmm2 имеет задержку 2c для обоих входов, если любой из входов поступил от vmulps. Но некоторые тасовки и другие инструкции работают в любом домене. Прошло некоторое время с тех пор, как я экспериментировал с этим, и я не сделал 'не проверяйте мои заметки, так что этот пример может быть не совсем правильным, но он выглядит примерно так.)

(Руководство по оптимизации Intel не упоминает этот постоянный эффект, который действует до тех пор, пока вы не перезапишите архитектурный регистр новым значениемПоэтому будьте осторожны при создании констант FP перед циклом с целочисленными инструкциями.)

...