【发布时间】:2019-01-11 18:53:38
【问题描述】:
仍在学习 SIMD 的艺术,我有一个问题:我有两个压缩的 8 位寄存器,我想将它们与 _mm_maddubs_epi16 (pmaddubsw) 相乘以得到一个 16 位的压缩寄存器。
我知道这些字节会产生总是小于 256 的数字,所以我想避免浪费剩余的 8 位。例如,_mm_maddubs_epi16(v1, v2) 的结果应该将结果写入r,XX 所在的位置,而不是它的位置(用__ 表示)。
v1 (04, 00, 0e, 00, 04, 00, 04, 00, 0a, 00, 0f, 00, 05, 00, 01, 00)
v2 (04, 00, 0e, 00, 04, 00, 04, 00, 0a, 00, 0f, 00, 05, 00, 01, 00)
r (__, XX, __, XX, __, XX, __, XX, __, XX, __, XX, __, XX, __, XX)
我可以不改变结果吗?
PS。我没有很好的处理器,我仅限于 AVX 指令。
【问题讨论】:
-
什么不能使用轮班?
-
在您的示例中,所有数字都是
<16和v1==v2。如果总是这样,您可以使用vpshufb(_mm256_shuffle_epi8) 进行表查找。 -
@Mysticial 不是我不能,而是我尽量避免使用太多操作。
-
@chtz 不幸的是,我的 CPU 上只有 AVX,没有 AVX2。
-
如果你没有AVX2,当然可以使用
pshufb(_mm_shuffle_epi8)。