2013-03-10 3 views
7

архитектуры AMD64 Руководства программиста Том 1: Прикладное программирование страницы 226 говорят относительно инструкции SSE:типов данных x64 SSE

Процессора не проверяет типа данных инструкций операндов до выполнения инструкций. Он проверяет их только в точке выполнения. Например, если процессор выполняет арифметическую команду , которая принимает операнды с двойной точностью, но снабжается операндами с одинарной точностью инструкциями MOVx , процессор сначала преобразует операнды с одной точностью в двойную точность до выполнения арифметической операции , и результат будет правильным. Однако требуемое преобразование может привести к ухудшению производительности.

Я не понимаю этого; Я бы подумал, что ymm-регистры просто содержат 256 бит, которые каждая команда интерпретирует в соответствии с ожидаемыми операндами, вам нужно убедиться, что здесь есть правильные типы, а в описанном сценарии CPU будет работать на полной скорости и тихо давать неверный ответ.

Что мне не хватает?

+1

Возможно, они ссылаются на то, что, если вы использовали 'movaps' для загрузки парных, это все равно работает? Немного странно говорить об этом так, как они это делали, тем более, что нет конверсии, но я не понимаю, что еще они могут иметь в виду. – harold

ответ

1

Intel® 64 and IA-32 Architectures Optimization Reference Manual § 5,1 говорит что-то подобное о смешивании/FP «типы данных» целое число (но любопытно не одиночный и парный):

При написании кода SIMD, который работает как для целых и данных с плавающей точкой, используйте подмножество команд преобразования SIMD или инструкции по загрузке/хранению, чтобы гарантировать, что входные операнды в регистрах XMM содержат типы данных, которые правильно определены , чтобы соответствовать инструкции.

Кодовые последовательности, содержащие перекрестное типизированное использование, дают одинаковый результат через различных реализаций, но при этом имеют значительный штраф в производительности. Использование Инструкции SSE/SSE2/SSE3/SSSE3/SSE44.1 для работы с несоответствующими типами Данные SIMD в регистре XMM категорически не приветствуются.

Intel® 64 and IA-32 Architectures Software Developer’s Manual является simularly запутанным:

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

...

Pentium 4 и Intel Xeon процессоров выполнять эти команды без генерации исключения недействительным операндами (#UD) и ожидаемых результатов в регистре XMM0 (то есть, высокая и низкая 64 -биты каждого регистра будут рассматриваться как значение с плавающей запятой двойной точности, и процессор будет работать на них соответственно).

...

В этом примере: XORPS или PXOR может быть использован вместо XORPD и дает один и тот же правильный результат.Однако из-за несоответствия типа между типом данных операнда и типом данных инструкции, штраф за латентность будет вызван в связи с выполнением инструкций на уровне микроархитектуры.

Задержки с задержкой также могут быть вызваны использованием инструкций перемещения неправильного типа. Например, MOVAPS и MOVAPD могут использоваться для перемещения упакованного операнда с одной точностью из памяти в регистр XMM. Тем не менее, , если используется MOVAPD, штраф за задержку будет понесен, когда правильно введенная команда попытается использовать данные в регистре .

Обратите внимание, что эти задержки не возникают при перемещении данных из регистров XMM в память.

Я действительно понятия не имеет, что это значит на «они только применять его на микроархитектурную уровне» за исключением того, что он предлагает различные «тип данных» трактуются по-разному в μ арке. У меня есть несколько догадок:

  • Ячейки AIUI, x86 обычно используют register renaming из-за нехватки регистров. Возможно, они внутренне используют разные регистры для целых/одиночных/двойных операндов, поэтому они могут быть расположены ближе к соответствующим векторным единицам.
  • Также представляется возможным, чтобы номера FP представлялись внутренне, используя другой формат (например, используя более высокий показатель, чтобы избавиться от денормов) и преобразовывались в канонические биты только тогда, когда это необходимо.
  • ЦП используют «forwarding» или «обход», так что исполнительным устройствам не нужно ждать, пока данные будут записаны в регистр, прежде чем он сможет использоваться последующими инструкциями, обычно сохраняя цикл или два. Это может не произойти между целым числом и единицами FP.
+0

В соответствии с ответом на http://stackoverflow.com/questions/6678073/ Разница между-movdqa-и-movaps-x86-инструкциями выглядит так, как это правильно. – rwallace

Смежные вопросы