小编ark*_*kan的帖子

如何使用 avx 将 int 64 转换为 int 32 (但不使用 avx-512)

我想将 4 个长整型(64 位)寄存器转换/打包为 4 个整数(32 位)。换句话说,将 int64 的 __m256i 转换为 int32 的 __m128i。

我没有 avx-512 供我使用,所以本质上是:

__m256i n;
__m128i r128i = _mm256_cvtepi64_epi32( n );
Run Code Online (Sandbox Code Playgroud)

不适合我。还有比下面的更好的替代方案吗?

失去矢量化:

__m256i n;
alignas(32) int64_t temp[4];
_mm256_store_si256((__m256i*)temp, n);
int32_t a = (int32_t)temp[0];
int32_t b = (int32_t)temp[1];
int32_t c = (int32_t)temp[2];
int32_t d = (int32_t)temp[3];
__m128i r128i = _mm_set_epi32(a, b, c, d);
Run Code Online (Sandbox Code Playgroud)

这打包成 16 位整数而不是 32 位

__m128i lo_lane = _mm256_castsi256_si128(n);
__m128i hi_lane = _mm256_extracti128_si256(n, 1);
__m128i r128i = _mm_packus_epi32(lo_lane, hi_lane);
Run Code Online (Sandbox Code Playgroud)

sse simd avx

3
推荐指数
1
解决办法
732
查看次数

标签 统计

avx ×1

simd ×1

sse ×1