【发布时间】:2012-10-19 09:20:24
【问题描述】:
我有一个简单的问题。具有起始 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())。非常感谢。
【问题讨论】:
-
你怎么可能得出使用 SSE 会很慢的结论???你测试过吗?
-
我不明白。你说你有一个 32 位的值,但你显示有四个 8 位的值?那 5 行“代码”应该表示是什么意思?为什么要加载 4 次值?
-
@jalf:这 5 行只是一个例子,我希望它尽可能具有指导性,因此我用小数字写了它。一般来说,真的会有32b个u_integers。
-
@jalf: 这些是我想要做的一个例子..如何获得 (125+5, 125+5+10, 125+5+10-1, 125 +5+10-1-5)。
-
我的提示:查看 Intel C++ Intrinsic Reference 以获得适合您需求的指令:software.intel.com/sites/default/files/m/9/4/c/8/e/…
标签: c++ performance sse