gpt4 book ai didi

c - SSE operator+= 用于 vector

转载 作者:行者123 更新时间:2023-12-02 07:37:07 25 4
gpt4 key购买 nike

我有两个 double 类型的数组,我想执行 vecA += vecB。到目前为止,我正在做 vecA = vecA + vecB 据我所知,例如整数写 i = i + 5i += 5 慢。所以我想知道,是否有一些 SSE 函数可以在 __m128d 上执行 operator+=。我搜索了一下,一无所获。我的应用程序将大约 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;
}

但速度方面没有任何改善。那么,__m128d有没有operator+=?或者有没有其他方法可以用来对 double 组执行 operator+= ?目标平台始终是使用 MSVC 的 Intel i7 CPU 上的 Windows(XP 和 7)。

最佳答案

你在做不必要的工作,现代编译器会自动生成这种代码。该功能称为“自动矢量化”。 MSVC 在 VS2012 中也支持它。我无法理解你的代码,所以我重写了它:

inline void addToDoubleVectorSSE(
const double * what, double * toWhat, const unsigned int len)
{
for (unsigned ix = 0; ix < len; ++ix)
toWhat[ix] += what[ix];
}

产生这个机器码的:

00A3102E  xor         eax,eax  
00A31030 movupd xmm0,xmmword ptr [esp+eax+358h]
00A31039 movupd xmm1,xmmword ptr [esp+eax+38h]
00A3103F add eax,10h
00A31042 addpd xmm1,xmm0 // <=== Look!!
00A31046 movupd xmmword ptr [esp+eax+348h],xmm1
00A3104F cmp eax,320h
00A31054 jb wmain+30h (0A31030h)

鉴于代码看起来更简洁,显然您应该支持此解决方案。如有必要,请更新您的 VS 版本。

关于c - SSE operator+= 用于 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15123418/

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