gpt4 book ai didi

c++ - 使用 AVX 内在函数计算具有允许标量值 0、1 和 2 的 vector 的内积

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:50:56 25 4
gpt4 key购买 nike

我正在做两列数以万计的内积。这些值只能是 0、1 或 2。因此它们可以存储为字符。如果在带有 avx 标志的 CPU 上对计算进行矢量化,我预计它会快 ~32 倍。但问题是乘法会自动将字符转换为整数,即 4 个字节。因此最多只能获得8倍的速度。能否达到32倍的速度?

顺便说一句,我正在使用带有 g++ 5.1 的 Linux(迄今为止的 Fedora 22)。

最佳答案

假设您有 AVX2 (不只是 AVX,它只适用于 float ),那么你可以使用 vpmaddubsw 指令,它的内在是:

__m256i _mm256_maddubs_epi16 (__m256i a, __m256i b)

这执行 8 位 x 8 位乘法(有符号 x 无符号,但这对您的情况无关紧要),然后添加成对的相邻项以给出 16 位结果。 [1]这有效地在一条指令中为您提供了 32 x 8 x 8 位乘法。

如果您没有 AVX2,则可以使用 128 位 SSE 版本 (_mm_maddubs_epi16) 在一条指令中获得 16 x x 8 x 8 位乘法。

请注意,对 16 位项进行水平求和可能需要几条指令,但由于您的输入范围非常小,因此您只需要相对不频繁地执行此水平求和。一种可能的方法(对于 SSE):

v = _mm_madd_epi16(v, _mm_set1_epi16(1));       // unpack/sum 16 -> 32
v = _mm_add_epi32(v, _mm_srli_si128(v, 8)); // shift and add 32 bit terms
v = _mm_add_epi32(v, _mm_srli_si128(v, 4));
sum = _mm_cvtsi128_si32(v); // extract sum as scalar

上面的 AVX2 实现作为练习留给读者。

关于c++ - 使用 AVX 内在函数计算具有允许标量值 0、1 和 2 的 vector 的内积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31382209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com