是的,我读到SIMD 代码运行速度比标量代码慢。不,它不是真正的复制品。
我一直在使用 2D 数学的东西,并且在将我的代码库从 C 移植到 C++ 的过程中。我用 C 碰到了几堵墙,这意味着我真的需要多态性,但那是另一回事了。无论如何,我不久前考虑过这个问题,但它提供了使用 2D 矢量类的绝佳机会,包括常见数学运算的 SSE 实现。是的,我知道那里有库,但我想自己尝试一下以了解发生了什么,而且我不使用任何比+=
.
我的实现是 via <immintrin.h>
,带有
union {
__m128d ss;
struct {
double x;
double y;
}
}
SSE 似乎很慢,所以我查看了它生成的 ASM 输出。在修复了一些愚蠢的指针后,我最终得到了以下指令集,循环运行了十亿次:(处理器是 AMD Phenom II,频率为 3.7GHz)
启用 SSE:1.1 到 1.8 秒(可变)
add $0x1, %eax
addpd %xmm0, %xmm1
cmp $0x3b9aca00, %eax
jne 4006c8
SSE 禁用:1.0 秒(相当恒定)
add $0x1, %eax
addsd %xmm0, %xmm3
cmp $0x3b9aca00, %eax
addsd %xmm2, %xmm1
jne 400630
我可以从中得出的唯一结论是,addsd
它比 快addpd
,并且流水线意味着额外的指令可以通过执行更多更快的部分重叠的事情的能力来补偿。
所以我的问题是:这值得吗,在实践中它真的有帮助吗,还是我不应该为愚蠢的优化而烦恼,让编译器在标量模式下处理它?