我有两个double
类型的数组,我想执行vecA += vecB
. 到目前为止,我正在做vecA = vecA + vecB
,据我所知,例如整数写入i = i + 5
比i += 5
. 所以我想知道,是否有一些 SSE 功能可以operator+=
在 __m128d 上执行。我搜索并一无所获。我的应用程序在此操作上花费了大约 60% 的时间vecA = vecA + vecB
,因此任何性能提升都会显示出来。
下面代码片段中的所有数组都是 16 字节对齐的,并且len
总是偶数。
原始代码很简单
inline void addToDoubleVectorSSE(
const double * what, const double * toWhat, double * dest, const unsigned int len)
{
__m128d * _what = (__m128d*)what;
__m128d * _toWhat = (__m128d*)toWhat;
for ( register unsigned int i = 0; i < len; i+= 2 )
{
*_toWhat = _mm_add_pd( *_what, *_toWhat );
_what++;
_toWhat++;
}
}
在阅读http://fastcpp.blogspot.cz/2011/04/how-to-process-stl-vector-using-sse.html之后作者通过不立即写入他刚刚读到的内容来获得性能,我试过了
__m128d * _what = (__m128d*)what;
__m128d * _toWhat = (__m128d*)toWhat;
__m128d * _toWhatBase = (__m128d*)toWhat;
__m128d _dest1;
__m128d _dest2;
for ( register unsigned int i = 0; i < len; i+= 4 )
{
_toWhatBase = _toWhat;
_dest1 = _mm_add_pd( *_what++, *_toWhat++ );
_dest2 = _mm_add_pd( *_what++, *_toWhat++ );
*_toWhatBase++ = _dest1;
*_toWhatBase++ = _dest2;
}
但速度上没有任何改善。那么,有什么operator+=
适合的__m128d
吗?或者还有其他方法可以用来对双精度数组执行 operator+= 吗?目标平台始终是使用 MSVC 的 Intel i7 CPU 上的 Windows(XP 和 7)。