- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
是的,我读了SIMD code runs slower than scalar code .不,这不是真正的重复。
我使用二维数学已有一段时间了,并且正在将我的代码库从 C 移植到 C++。我在使用 C 时遇到了一些问题,这意味着我确实需要多态性,但那是另一回事了。不管怎样,我之前考虑过这个,但它提供了一个使用 2D vector 类的绝好机会,包括常见数学运算的 SSE 实现。是的,我知道那里有图书馆,但我想自己尝试一下以了解发生了什么,而且我没有使用比 +=
更复杂的东西。 .
我的实现是通过 <immintrin.h>
, 用一个
union {
__m128d ss;
struct {
double x;
double y;
}
}
SSE 似乎很慢,所以我查看了它生成的 ASM 输出。在用指针修复了一些愚蠢的东西之后,我得到了以下指令集,循环运行十亿次:(处理器是 3.7GHz 的 AMD Phenom II)
启用 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
快,并且流水线意味着额外的指令可以通过更快地完成部分重叠的事情的能力来补偿。
所以我的问题是:这是否值得,在实践中它是否真的有用,或者我是否应该不理会愚蠢的优化并让编译器以标量模式处理它?</p>
最佳答案
这需要更多的循环展开和缓存预取。您的算术密度非常低:1 次操作对应 2 次内存操作,因此您需要在管道中尽可能多地塞满这些操作。
也不要使用 union,而是直接使用 __m128d,并使用 _mm_load_pd 从数据中填充 __m128。 union 中的 _m128 生成错误代码,其中所有元素都在进行有害的堆栈-注册-堆栈舞蹈。
关于c++ - 微小的 SSE addpd 循环比 AMD Phenom II 上的标量稍慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11145734/
是的,我读了SIMD code runs slower than scalar code .不,这不是真正的重复。 我使用二维数学已有一段时间了,并且正在将我的代码库从 C 移植到 C++。我在使用
自从我使用 MSVC 2013 以来,我的应用程序在执行以下代码时崩溃了(稀疏矩阵乘以 vector ,伪代码:A = this * pVector): complex x = (A.getValue
我是一名优秀的程序员,十分优秀!