Страница 1 из 1

Копирование из регистра в регистр

Добавлено: 04 окт 2009, 22:20
fluck
Есть xmm-регистр, в котором хранятся два вещественных числа 2-ой точности (double A,B )
xmm0 = (A,B )
Нужно скопировать эти числа в другой xmm-регистр, допустим xmm1, используя SSE2 интструкции так чтобы число А оказалось в младших 64-битах, а B в старших 64 битах. Т.е:
xmm1 = ( B,A)
И как будет быстрее: поменять сначала числа местами в xmm0-регистре (xmm=(B,A)) и потом его без изменений скопировать в xmm1 или сразу скопировать с преобразованием, не изменяя xmm0

Re: Копирование из регистра в регистр

Добавлено: 06 окт 2009, 09:52
somewhere
&quot писал(а):поменять сначала числа местами в xmm0-регистре
Вообще по условию задачи xmm0 не должен измениться.
Никакие инструкции SSE2 не различают XMM0 и остальные. А значит быстрее будет так:

Код: Выделить всё

pshufd xmm1, xmm0, 01001110b

Re: Копирование из регистра в регистр

Добавлено: 06 окт 2009, 11:52
fluck
somewhere писал(а):Вообще по условию задачи xmm0 не должен измениться.
Никакие инструкции SSE2 не различают XMM0 и остальные. А значит быстрее будет так:
спасибо. А если мне нужно переслать данные из ХMMO в два других ХMM -регистра (скажем в XMM1 и XMM2), то вот это:

Код: Выделить всё

pshufd xmm1, xmm0, 01001110b
pshufd xmm2, xmm0, 01001110b
будет ли быстрее, чем:

Код: Выделить всё

pshufd xmm0, xmm0, 01001110b
movapd xmm1,xmm0
movapd xmm2,xmm0

Re: Копирование из регистра в регистр

Добавлено: 06 окт 2009, 23:58
somewhere
Если верить мануалу интел, то PSHUFD XMM, XMM задействует строго PORT_0, выполняется за один такт последовательно. А вот MOVAPD\MOVUPD XMM, XMM как на PORT_0 так и на PORT_1 за один такт, это означает что если операнды независимы (например выше результат xmm2 не зависит от xmm1) то обе инструкции movapd выполнятся параллельно за один такт. Значит второй вариант с mov быстрее.

Re: Копирование из регистра в регистр

Добавлено: 07 окт 2009, 13:30
fluck
somewhere писал(а):Если верить мануалу интел, то PSHUFD XMM, XMM задействует строго PORT_0, выполняется за один такт последовательно. А вот MOVAPD\MOVUPD XMM, XMM как на PORT_0 так и на PORT_1 за один такт, это означает что если операнды независимы (например выше результат xmm2 не зависит от xmm1) то обе инструкции movapd выполнятся параллельно за один такт. Значит второй вариант с mov быстрее.
Интересная информация. Спасибо. Но это возможно лишь тогда когда инструкции спарены, т.е. идут одна за другой? Или не обязательно?
Если это так, то какие ещё из SSE2-инструкций поддерживают эту фичу?
(очень интересует, будет ли эффект от спаривания 2-х mulpd или addpd)?

Re: Копирование из регистра в регистр

Добавлено: 07 окт 2009, 13:37
somewhere
Нет, не обязательно, между ними может быть инструкция, не задействующая АЛУ SSE, она в принципе должна войти в тот же такт, что и те две. Порядок выполнения инструкций определяет конвеер, который определяет какие инструкции между собой зависимы и распределяет вычисления по разным АЛУ.
&quot писал(а):Если это так, то какие ещё из SSE2-инструкций поддерживают эту фичу?
мануал дома, если только вечером посмотрю