我想将 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)