【发布时间】:2018-02-08 14:04:54
【问题描述】:
_mm256_blendv_pd() 查看位置 63、127、191 和 255 中的位。有没有一种有效的方法将 uint8_t 的 4 个低位分散到 AVX 寄存器的这些位置?
或者,是否有一种有效的方法来广播这些位,以便像 _mm256_cmp_pd() 的结果一样,每个位在 AVX 寄存器的相应 64 位组件中重复?
指令集是 AVX2(如果需要其他功能,Ryzen CPU)。
【问题讨论】:
-
因为 63、127、191 和 255 不是 2 的幂,它们不能作为掩码来指示位位置。如果它们是位向量的索引,那么您至少有 255 位要处理。 'unit8_t' 包含 8 位(因此是 '8')所以您问是否可以用 8 位表示 255 位?这似乎不太可能。您需要先纠正问题,然后才能得到有意义的答案。
-
如果你是非一,64、128 和 256 是 2 的幂,所以它们可能是位掩码,但 192 不符合模式(fwiw 它是 64 + 128,但那是两位)所以....
-
@DaleWilson,这是一个关于 AVX(2) 技术的问题,它操作 256 位向量。
uint8_t最初有 4 位。我想将它们移动到指定的位置(你不明白:63、127、191 和 255 是从 0 开始的位位置,而不是掩码)到 256 位 AVX 寄存器。 -
足够接近复制;只需省略广播到所有位的部分。 (请注意,
pdep在 Ryzen 上速度很慢)。只有 4 位确实使 LUT 具有吸引力。您可以压缩 LUT 并使用vpmovsxbq加载它。
标签: c++ bit-manipulation vectorization x86-64 avx2