我有一个简单的问题。具有起始 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())。非常感谢。