C++ 如何在AVX2中从32位无符号整数转换为16位无符号整数?

C++ 如何在AVX2中从32位无符号整数转换为16位无符号整数?,c++,performance,vectorization,simd,avx2,C++,Performance,Vectorization,Simd,Avx2,我使用\u mm256\u cvtps\u epi32()将8位浮点数转换为8x32位整数。但目标是得到16位无符号整数。我有两个向量a0和a1,每一个都是\uuum256i类型。打包它们的最快方法是什么,以便将16位等价物a0放入结果的较低128位,将a1等价物放入较高128位 这是我到目前为止得到的,其中p0和p1是两个\uuuum256向量,每个向量有8个浮点数s: const __m256i vShuffle = _mm256_setr_epi8( 0, 1, 4, 5, 8, 9,

我使用
\u mm256\u cvtps\u epi32()
将8位浮点数转换为8x32位整数。但目标是得到16位无符号整数。我有两个向量
a0
a1
,每一个都是
\uuum256i
类型。打包它们的最快方法是什么,以便将16位等价物
a0
放入结果的较低128位,将
a1
等价物放入较高128位

这是我到目前为止得到的,其中
p0
p1
是两个
\uuuum256
向量,每个向量有8个
浮点数
s:

const __m256i vShuffle = _mm256_setr_epi8(
  0, 1, 4, 5, 8, 9, 12, 13, -1, -1, -1, -1, -1, -1, -1, -1,
  -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 4, 5, 8, 9, 12, 13);
const __m256i a0 = _mm256_cvtps_epi32(p0);
const __m256i a1 = _mm256_cvtps_epi32(p1);
const __m256i b0 = _mm256_shuffle_epi8(a0, vShuffle);
const __m256i b1 = _mm256_shuffle_epi8(a1, vShuffle);
const __m128i c0 = _mm_or_si128(_mm256_extracti128_si256(b0, 0), _mm256_extracti128_si256(b0, 1));
const __m128i c1 = _mm_or_si128(_mm256_extracti128_si256(b1, 0), _mm256_extracti128_si256(b1, 1));
return _mm256_setr_m128i(c0, c1);

我没有测试该代码,但它应该可以帮你:

__m256i tmp1 = _mm256_cvtps_epi32(p0);
__m256i tmp2 = _mm256_cvtps_epi32(p1);
tmp1 = _mm256_packus_epi32(tmp1, tmp2);
tmp1 = _mm256_permute4x64_epi64(tmp1, 0xD8);
// _mm256_store_si256 this

大概其中一条洗牌指令会起作用?@AlanBirtles,我试过
\u mm256\u shuffle\u epi8
,但它不会在128位通道上洗牌。有没有关于如何解决反问题的提示?给定
\uuuum256i
将其解压为2个浮点向量。