2015-07-29 3 views
1

Я написал простую программу сложения векторов с использованием векторных внутренних операций в C. Здесь я загружаю 2 вектора и добавляю их, наконец, возвращаю вектор результата обратно в глобальную память.Операнды для инструкции PADDD

Когда я проверить код сборки, имеет следующую последовательность инструкций

movdqa 0(%rbp,%rax), %xmm7  
paddd (%r12,%rax), %xmm7 
movdqa %xmm7, (%rbx,%rax) 

Как вы можете видеть, он движется только один операнд paddd инструкции к регистру (xmm7). В инструкции paddd 1-й операнд ссылается на адрес в глобальной памяти вместо того, чтобы сначала перенести регистр.

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

movdqa 0(%rbp,%rax), %xmm7 
movdqa 0(%r12,%rax), %xmm8  
paddd %xmm8, %xmm7 
movdqa %xmm7, (%rbx,%rax) 

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

+1

Это эквивалент второго примера, за исключением того, что XMM8 не изменяется. Или, если бы вы использовали один и тот же базовый регистр (R12 vs R11) в обоих примерах. –

+3

Инструкции часто разбиваются на один или несколько процессоров в процессоре. 'paddd (% r12,% rax),% xmm7' является инструкцией для двух процессоров на большинстве процессоров. Один для загрузки и один для добавления. – Mysticial

ответ

6

Большинство инструкций x86 можно использовать с операндом источника памяти. Дополнительного регистра не требуется. Инструкции чтения-изменения так же быстро, как и комбинация нагрузки, а затем операции. Преимущество состоит в том, что он занимает меньше байтов команд и не нуждается в дополнительном регистре.

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

См. http://agner.org/optimize/ для документации по внутренним компонентам центрального процессора и как оптимизировать ваш asm и код C.

+1

Один из причуд, который я нашел с использованием встроенных SSE-функций с GCC, заключается в том, что он не будет транспонировать аргументы ассоциативных операций, таких как 'add', чтобы переместить операнд потенциальной памяти в слот, где его можно сложить в одну команду. –

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