Есть xmm-регистр, в котором хранятся два вещественных числа 2-ой точности (double A,B )
xmm0 = (A,B )
Нужно скопировать эти числа в другой xmm-регистр, допустим xmm1, используя SSE2 интструкции так чтобы число А оказалось в младших 64-битах, а B в старших 64 битах. Т.е:
xmm1 = ( B,A)
И как будет быстрее: поменять сначала числа местами в xmm0-регистре (xmm=(B,A)) и потом его без изменений скопировать в xmm1 или сразу скопировать с преобразованием, не изменяя xmm0
Копирование из регистра в регистр
Модератор: Andy
Вообще по условию задачи xmm0 не должен измениться." писал(а):поменять сначала числа местами в xmm0-регистре
Никакие инструкции SSE2 не различают XMM0 и остальные. А значит быстрее будет так:
Код: Выделить всё
pshufd xmm1, xmm0, 01001110b
It's a long way to the top if you wanna rock'n'roll
спасибо. А если мне нужно переслать данные из ХMMO в два других ХMM -регистра (скажем в XMM1 и XMM2), то вот это:somewhere писал(а):Вообще по условию задачи xmm0 не должен измениться.
Никакие инструкции SSE2 не различают XMM0 и остальные. А значит быстрее будет так:
Код: Выделить всё
pshufd xmm1, xmm0, 01001110b
pshufd xmm2, xmm0, 01001110b
Код: Выделить всё
pshufd xmm0, xmm0, 01001110b
movapd xmm1,xmm0
movapd xmm2,xmm0
Если верить мануалу интел, то PSHUFD XMM, XMM задействует строго PORT_0, выполняется за один такт последовательно. А вот MOVAPD\MOVUPD XMM, XMM как на PORT_0 так и на PORT_1 за один такт, это означает что если операнды независимы (например выше результат xmm2 не зависит от xmm1) то обе инструкции movapd выполнятся параллельно за один такт. Значит второй вариант с mov быстрее.
It's a long way to the top if you wanna rock'n'roll
Интересная информация. Спасибо. Но это возможно лишь тогда когда инструкции спарены, т.е. идут одна за другой? Или не обязательно?somewhere писал(а):Если верить мануалу интел, то PSHUFD XMM, XMM задействует строго PORT_0, выполняется за один такт последовательно. А вот MOVAPD\MOVUPD XMM, XMM как на PORT_0 так и на PORT_1 за один такт, это означает что если операнды независимы (например выше результат xmm2 не зависит от xmm1) то обе инструкции movapd выполнятся параллельно за один такт. Значит второй вариант с mov быстрее.
Если это так, то какие ещё из SSE2-инструкций поддерживают эту фичу?
(очень интересует, будет ли эффект от спаривания 2-х mulpd или addpd)?
Нет, не обязательно, между ними может быть инструкция, не задействующая АЛУ SSE, она в принципе должна войти в тот же такт, что и те две. Порядок выполнения инструкций определяет конвеер, который определяет какие инструкции между собой зависимы и распределяет вычисления по разным АЛУ.
мануал дома, если только вечером посмотрю" писал(а):Если это так, то какие ещё из SSE2-инструкций поддерживают эту фичу?
It's a long way to the top if you wanna rock'n'roll