【发布时间】:2012-06-01 08:40:10
【问题描述】:
问题
是否有任何计算上可行的方法来使用 x86 SIMD 指令对一组整数进行寄存器内重复数据删除?
示例
我们有一个 4 元组寄存器 R1 = {3, 9, 2, 9},希望得到寄存器 R2 = {3, 9, 2, NULL}。
限制
稳定性。保留输入顺序没有意义。
输出。但是,任何删除的值/NULL 都必须位于寄存器的开头和/或结尾:
- {null, 1, 2, 3} - 好的
- {1, 2, null, null} - 好的
- {null, 2, null, null} - 好的
- {null, 2, null, 1} - 无效的顺序
- {null, null, null, null} - 无效输出
如果已知它会产生一种特定的输出格式,这显然是一种奖励。请假设 NULL 有效地表示 0(零)。
一般性。必须能够容忍不存在重复,并且在这种情况下产生与输入寄存器等效的输出。
指令集。我正在寻找以下任何或全部的解决方案:SSE2-SSSE3; SSE4.x; AVX-AVX2
【问题讨论】:
-
例如,在 SSE4 中,可能能够迭代地使用 RMAX = _mm_max_epi32,并且仅当 RMAX != RMAX_PREV 时才从 RMAX 有条件地写入输出寄存器?
-
假设这是作业:您应该查看
pshufd和pcmpeqd说明。 -
哈哈,不,这不是作业。 ;)
标签: algorithm assembly sse simd avx