2

我的输入数据是 16 位数据,我需要使用 SSE2 指令集找到 3 个值的中位数。

如果我有 3 个 16 位输入值 A、B 和 C,我想这样做:

D = max( max( A, B ), C )
E = min( min( A, B ), C )
median = A + B + C - D - E

我打算使用的 C 函数是:

  • 最大值 - _mm_max_epi16
  • 分钟 - _mm_min_epi16
  • 添加 - _mm_add_epi16
  • 减去 - _mm_sub_epi16

任何人都可以提出更好的方法吗?

4

1 回答 1

7

你的想法很聪明,但你可以用更少的操作来做到这一点,只需使用 max 和 min。

t1 = min(A, B)
t2 = max(A, B)
t3 = min(t2, C)
median = max(t1, t3)

与原始实现中的 8 条相比,这将只是 4 条 SSE 指令。

请注意,这实际上只是 N = 3 的修剪排序网络

于 2010-10-20T10:13:25.673 回答