Я написал простую программу сложения векторов с использованием векторных внутренних операций в 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)
Позвольте мне знать, если вам нужна дополнительная информация, как компилируемый программы, так что вы можете создать сборку для себя.
Это эквивалент второго примера, за исключением того, что XMM8 не изменяется. Или, если бы вы использовали один и тот же базовый регистр (R12 vs R11) в обоих примерах. –
Инструкции часто разбиваются на один или несколько процессоров в процессоре. 'paddd (% r12,% rax),% xmm7' является инструкцией для двух процессоров на большинстве процессоров. Один для загрузки и один для добавления. – Mysticial