基本上,我如何使用 AVX2 内在函数编写与此等效的内容?我们这里假设 result_in_float
是 __m256
类型,而 result
是 short int*
或 短整数 [8]
。
for(i = 0; i < 8; i++)
result[i] = (short int)result_in_float[i];
我知道可以使用 __m256i _mm256_cvtps_epi32(__m256 m1)
内在函数将 float 转换为 32 位整数,但不知道如何将这些 32 位整数进一步转换为 16 位整数。而且我不仅想要那个,还想要将这些值(以 16 位整数的形式)存储到内存中,我想全部使用 vector 指令来完成。
在互联网上搜索,我发现了一个名为_mm256_mask_storeu_epi16
的内在函数,但我不确定这是否能解决问题,因为我找不到它的用法示例.
最佳答案
_mm256_cvtps_epi32
是很好的第一步,转换为压缩 vector 的短裤有点烦人,需要跨切片洗牌(所以它不在此处的依赖链中是件好事)。
由于可以假设值在正确的范围内(根据评论),我们可以使用 _mm256_packs_epi32
而不是 _mm256_shuffle_epi8
来进行转换,无论哪种方式这是端口 5 上的 1 周期指令,但使用 _mm256_packs_epi32
避免了必须从某处获取洗牌掩码。
所以放在一起(未测试)
__m256i tmp = _mm256_cvtps_epi32(result_in_float);
tmp = _mm256_packs_epi32(tmp, _mm256_setzero_si256());
tmp = _mm256_permute4x64_epi64(tmp, 0xD8);
__m128i res = _mm256_castsi256_si128(tmp);
// _mm_store_si128 that
最后一步(cast)是免费的,它只是改变了类型。
如果您有两个浮点 vector 要转换,您可以重复使用大部分指令,例如:(也未测试)
__m256i tmp1 = _mm256_cvtps_epi32(result_in_float1);
__m256i tmp2 = _mm256_cvtps_epi32(result_in_float2);
tmp1 = _mm256_packs_epi32(tmp1, tmp2);
tmp1 = _mm256_permute4x64_epi64(tmp1, 0xD8);
// _mm256_store_si256 this
关于c++ - 如何使用 avx 指令将 float vector 转换为 short int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41228180/