gpt4 book ai didi

optimization - 为什么movlps和movhps SSE指令比movups传输未对齐数据的速度更快?

转载 作者:行者123 更新时间:2023-12-03 15:59:49 26 4
gpt4 key购买 nike

我发现在一些用于数学计算的SSE优化代码中,它们使用movlps和movhps指令的组合而不是单个movups指令来传输未对齐的数据。我不知道为什么,所以我自己尝试了一下,这是下面的伪代码:

struct Vec4
{
float f[4];
};

const size_t nSize = sizeof(Vec4) * 100;
Vec4* pA = (Vec4*)malloc( nSize );
Vec4* pB = (Vec4*)malloc( nSize );
Vec4* pR = (Vec4*)malloc( nSize );

...Some data initialization code here
...Records current time by QueryPerformanceCounter()

for( int i=0; i<100000, ++i )
{
for( int j=0; j<100; ++j )
{
Vec4* a = &pA[i];
Vec4* b = &pB[i];
Vec4* r = &pR[i];
__asm
{
mov eax, a
mov ecx, b
mov edx, r

...option 1:

movups xmm0, [eax]
movups xmm1, [ecx]
mulps xmm0, xmm1
movups [edx], xmm0

...option 2:

movlps xmm0, [eax]
movhps xmm0, [eax+8]
movlps xmm1, [ecx]
movhps xmm1, [ecx+8]
mulps xmm0, xmm1
movlps [edx], xmm0
movhps [edx+8], xmm0
}
}
}

...Calculates passed time

free( pA );
free( pB );
free( pR );

我运行了很多次代码,并计算了它们的平均时间。

对于movups版本,结果约为50ms。

对于movlps(movhps版本),结果约为46ms。

我还尝试了在结构上使用__declspec(align(16))描述符的数据对齐版本,并由_aligned_malloc()分配,结果约为34ms。

为什么movlps和movhps的组合速度更快?这是否意味着我们最好使用movlps和movhps而不是movups?

最佳答案

这一代的速龙(K8)仅具有64位宽的ALU单元。因此,每条128位SSE指令都需要分成两个64位指令,这会导致某些指令的开销。

在这种类型的处理器上,与相等的MMX代码相比,使用SSE通常不会加快速度。

The microarchitecture of Intel, AMD and VIA CPUs: An optimization guide for assembly programmers and compiler makers:中引用Agner雾

12.9 64 bit versus 128 bit instructions

It is a big advantage to use 128-bit instructions on K10, but not on K8 because each 128-bit instruction is split into two 64-bit macro-operations on the K8.

128 bit memory write instructions are handled as two 64-bit macro-operations on K10, while 128 bit memory read is done with a single macro-operation on K10 (2 on K8).

128 bit memory read instructions use only the FMISC unit on K8, but all three units on K10. It is therefore not advantageous to use XMM registers just for moving blocks of data from one memory position to another on the k8, but it is advantageous on K10.

关于optimization - 为什么movlps和movhps SSE指令比movups传输未对齐数据的速度更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13522525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com