小编Pin*_*oyd的帖子

使用 AVX2 实现 _mm256_mullo_epi4 的最快方法

对于研究问题,我需要使用 AVX2/AVX 指令实现非常高效的 4 位乘法(仅需要低 4 位)。

我目前的做法是:

__m256i _mm256_mullo_epi4(const __m256i a, const __m256i b) {
    __m256i mask_f_0 = _mm256_set1_epi16(0x000f);
    __m256i tmp_mul_0 = _mm256_and_si256(_mm256_mullo_epi16(a, b), mask_f_0);
    __m256i tmp_mul_1 = _mm256_and_si256(_mm256_mullo_epi16(_mm256_srli_epi16(a,   4), _mm256_srli_epi16(b,   4)), mask_f_0);
    __m256i tmp_mul_2 = _mm256_and_si256(_mm256_mullo_epi16(_mm256_srli_epi16(a,   8), _mm256_srli_epi16(b,   8)), mask_f_0);
    __m256i tmp_mul_3 = _mm256_and_si256(_mm256_mullo_epi16(_mm256_srli_epi16(a,  12), _mm256_srli_epi16(b,  12)), mask_f_0);
    __m256i tmp1 = _mm256_xor_si256(tmp_mul_0, _mm256_slli_epi16(tmp_mul_1, 4));
    __m256i tmp2 = _mm256_xor_si256(tmp1, _mm256_slli_epi16(tmp_mul_2, 8));
    __m256i tmp  = _mm256_xor_si256(tmp2, _mm256_slli_epi16(tmp_mul_3, 12));
    return tmp;
}
Run Code Online (Sandbox Code Playgroud)

此实现利用相对昂贵的_mm256_mullo_epi16指令 4 次来limb单独计算每个 4 位。这可以以某种方式更快地完成吗?更准确地说:是否可以减少所需指令的数量?

c x86-64 intrinsics avx avx2

5
推荐指数
1
解决办法
155
查看次数

标签 统计

avx ×1

avx2 ×1

c ×1

intrinsics ×1

x86-64 ×1