AVX 将 __m256i 打包的 32 位整数除以二(无 AVX2)
AVX divide __m256i packed 32-bit integers by two (no AVX2)
我正在寻找使用 AVX 将 __m256i
压缩 32 位整数除以二(即右移一位)的最快方法。我无权访问 AVX2。
据我所知,我的选择是:
- 下降到 SSE2
- 类似于AVX __m256i integer division for signed 32-bit elements
万一我需要使用 SSE2,我会很感激最好的 SSE2 实现。
如果是 2),我想知道要使用的内在函数,以及是否有专门除以 2 的更优化的实现。
谢谢!
假设你知道自己在做什么,这就是那个函数。
inline __m256i div2_epi32( __m256i vec )
{
// Split the 32-byte vector into 16-byte ones
__m128i low = _mm256_castsi256_si128( vec );
__m128i high = _mm256_extractf128_si256( vec, 1 );
// Shift the lanes within each piece; replace with _mm_srli_epi32 for unsigned version
low = _mm_srai_epi32( low, 1 );
high = _mm_srai_epi32( high, 1 );
// Combine back into 32-byte vector
vec = _mm256_castsi128_si256( low );
return _mm256_insertf128_si256( vec, high, 1 );
}
但是,这样做不一定比处理 16 字节向量更快。在大多数 CPU 上,这些 insert/extract 指令的性能不是很好,也许 AMD Zen 1 CPU.
除外
我正在寻找使用 AVX 将 __m256i
压缩 32 位整数除以二(即右移一位)的最快方法。我无权访问 AVX2。
据我所知,我的选择是:
- 下降到 SSE2
- 类似于AVX __m256i integer division for signed 32-bit elements
万一我需要使用 SSE2,我会很感激最好的 SSE2 实现。 如果是 2),我想知道要使用的内在函数,以及是否有专门除以 2 的更优化的实现。 谢谢!
假设你知道自己在做什么,这就是那个函数。
inline __m256i div2_epi32( __m256i vec )
{
// Split the 32-byte vector into 16-byte ones
__m128i low = _mm256_castsi256_si128( vec );
__m128i high = _mm256_extractf128_si256( vec, 1 );
// Shift the lanes within each piece; replace with _mm_srli_epi32 for unsigned version
low = _mm_srai_epi32( low, 1 );
high = _mm_srai_epi32( high, 1 );
// Combine back into 32-byte vector
vec = _mm256_castsi128_si256( low );
return _mm256_insertf128_si256( vec, high, 1 );
}
但是,这样做不一定比处理 16 字节向量更快。在大多数 CPU 上,这些 insert/extract 指令的性能不是很好,也许 AMD Zen 1 CPU.
除外