【问题标题】:AVX2: Is there a way to implement _mm256_mul_epi8 function for a constant power of 2?AVX2:有没有办法实现 _mm256_mul_epi8 函数以获得恒定的 2 幂?
【发布时间】:2021-10-29 04:13:54
【问题描述】:

我想对 8 位元素执行以下操作:

_a = _b * 8 + _c

带有向量。对于加号,显然有_mm256_add_epi8,但我找不到_mm256_mul_epi8 或与8 位元素相乘的东西。我还试图找到一个左移 3 的函数,但没有运气。

感谢您的帮助!

【问题讨论】:

  • 值太大会怎样?饱和/环绕/未定义的行为? bc 是签名还是未签名?
  • @chtz 它是无符号的,而且_b 内部的最大值是 7,所以左移 3 不会造成溢出。所以一切都应该没问题。

标签: c++ simd intrinsics avx avx2


【解决方案1】:

您只需添加:

__m256i _b2 = _mm256_add_epi8(_b,_b);
__m256i _b4 = _mm256_add_epi8(_b2,_b2);
__m256i _b8 = _mm256_add_epi8(_b4,_b4);
__m256i _a = _mm256_add_epi8(_b8,_c);

如果您屏蔽掉每个字节的高位以模拟移出,您也可以对任何移位执行此操作:

// not needed if _b values are smaller than 32
__m256i _b_low = _mm256_and_si256(_b,_mm256_set1_epi8(0x1F));

__m256i _b8 = _mm256_slli_epi32(_b_low,3);
__m256i _a = _mm256_add_epi8(_b8,_c);

【讨论】:

  • 注:如果已知b 小于32,则不需要位掩码操作。
猜你喜欢
  • 1970-01-01
  • 2021-04-21
  • 2021-08-26
  • 2019-07-23
  • 2020-07-12
  • 1970-01-01
  • 2022-01-05
  • 2018-09-06
  • 1970-01-01
相关资源
最近更新 更多