我从下面的SIMD代码中查看了Visual Studio 2012的汇编输出:
float *end = arr + sz;
float *b = other.arr;
for (float *a = arr; a < end; a += 4, b += 4)
{
__m128 ax = _mm_load_ps(a);
__m128 bx = _mm_load_ps(b);
ax = _mm_add_ps(ax, bx);
_mm_store_ps(a, ax);
}
循环体是:
$LL11@main:
movaps xmm1, XMMWORD PTR [eax+ecx]
addps xmm1, XMMWORD PTR [ecx]
add ecx, 16 ; 00000010H
movaps XMMWORD PTR [ecx-16], xmm1
cmp ecx, edx
jb SHORT $LL11@main
为什么要将ecx
增加16,只有在下一行存储到它时才减去16?
(提示:这可能是由于栈帧对齐所致)
eax
中,并在第一次加载时添加它,而不是保持两个指针并将两者都增加16。除了内存访问之外的额外加法基本上是免费的吗? - japreiss