タイプの配列が2つありdouble
、実行したいvecA += vecB
。これまでのところ、私はやってvecA = vecA + vecB
おり、私が知る限り、たとえば整数の書き込みi = i + 5
は。よりも遅いですi += 5
。ですから、__m128dで実行するSSE関数があるかどうか疑問に思ってい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;
}
しかし、スピード的には改善は起こりません。それで、何かありますoperator+=
か__m128d
?または、doubleの配列に対してoperator + =を実行するために使用できる他の方法はありますか?ターゲットプラットフォームは、MSVCを使用して、常にIntel i7 CPU上のWindows(XPおよび7)になります。