我有一個簡單的問題。例如(+ 5,+ 10,-1,-5)具有開始的uint_32值(比如125)和要添加的操作數__m128i。我想盡可能快地得到的是一個向量(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())。非常感謝。
你怎麼可能來,使用SSE將是緩慢的做了結論???你測試過了嗎? –
我不明白。你說你有一個32位的值,但你顯示有四個8位值?這5行「代碼」應該是什麼意思*?爲什麼你必須加載值4次? – jalf
@Tony獅子:那不是我的觀點! Ofc SSE將是最快的解決方案。我的意思是 - 沒有更好的算法(在SSE框架中)比做這4個增加? –