簡単な問題があります。uint_32 の開始値 (125 など) と追加するオペランドの __m128i (+5、+10、-1、-5) を持ちます。できるだけ早く取得したいのは、ベクトル (125 + 5、125 + 5 + 10、125 + 5 + 10 - 1、125 + 5 + 10 - 1 - 5)、つまり、オペランドから値を累積的に追加することです開始値に。これまでのところ、私が考えることができる唯一の解決策は、4 つの __m128i 変数を追加することです。たとえば、次のようになります。
/* pseudoSSE code... */
__m128i src = (125,125,125,125)
__m128i operands =(5,10,-1,-5)
/* Here I omit the partitioning of operands into add1,..add4 for brevity */
__m128i add1 = (+05,+05,+05,+05)
__m128i add2 = (+00,+10,+10,+10)
__m128i add3 = (+00,+00,-01,-01)
__m128i add4 = (+00,+00,+00,-05)
__m128i res1 = _mm_add_epu32( add1, add2 )
__m128i res2 = _mm_add_epu32( add3, add4 )
__m128i res3 = _mm_add_epu32( res1, add2 )
__m128i res = _mm_add_epu32( res3, src )
このように、私は私が欲しかったものを手に入れます。このソリューションでは、すべての add_ 変数を設定してから、4 つの追加を実行する必要があります。私が本当に求めているのは、これがより速くできるかどうかです。いくつかの異なるアルゴを介して、またはおそらくまだ知らない特殊な SSE 関数 (_mm_cumulative_sum() など) を使用します。どうもありがとう。