Почему в инструкциях SSE "mov" указано, что они перемещают значения с плавающей запятой?
Многие инструкции SSE "mov" указывают, что они перемещают значения с плавающей запятой. Например:
- MOVHLPS-Move Упакованные одноточечные значения с плавающей запятой от высокой к низкой
- MOVSD-Move Scalar Double-Precision Floating Point Point
- MOVUPD-Move Unaligned Packed Double Precision Floating Point Point
Почему эти инструкции не говорят, что они перемещают 32-битные или 64-битные значения? Если они просто перемещают бит вокруг, почему инструкции указывают, что они предназначены для значений с плавающей запятой? Разумеется, они будут работать, интерпретируете ли эти биты как плавающие или нет?
Ответы
Ответ 1
Я думаю, что нашел ответ: некоторые микроархитектуры выполняют инструкции с плавающей запятой для разных исполнительных блоков, чем целые инструкции. Вы получаете лучшую общую задержку, когда поток инструкций остается в пределах одного и того же "домена" (целая или плавающая точка). Это подробно описано в руководстве по оптимизации Agner Fog в разделе "Задержки байпаса данных": http://www.agner.org/optimize/microarchitecture.pdf
Я нашел это объяснение в этом подобном вопросе SO: Разница между инструкциями MOVDQA и MOVAPS x86?
Ответ 2
В случае, если кто-то заботится, именно поэтому в векторном классе Agner Fog у него есть отдельные векторные классы для использования с булевым float (Vec4fb) и логическим целым (Vec4i)
http://www.agner.org/optimize/#vectorclass
В своем руководстве он пишет.
"Причина, по которой мы определили отдельный булевский векторный класс для
использование векторов с плавающей запятой заключается в том, что оно позволяет нам создавать более быстрый код. (Многие
современные ЦП имеют отдельные исполнительные блоки для целых векторов и плавающие
точечные векторы. Иногда возможно выполнять булевы операции в
с плавающей точкой и тем самым избежать задержки с перемещением данных между двумя
единицы) ".
В большинстве вопросов о SSE и AVX можно получить ответ, прочитав его руководство и, что более важно, посмотреть на код в его векторном классе.