c++ - 如何使用 avx 指令将 float vector 转换为 short int?

标签 c++ c gcc avx avx2

基本上,我如何使用 AVX2 内在函数编写与此等效的内容?我们这里假设 result_in_float__m256 类型,而 resultshort 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/

相关文章:

c++ - boost::thread_specific_ptr 无法访问类中声明的私有(private)成员

c - 是否有可能检测到内存块被 C 上的杂散指针或野指针更改?

c - 运行具有多个输入文件和进程数的 MPI 程序

c++ - 无法在动态链接库中找到过程入口点 _ZNSt7_cxx1112basic_stringlcSt11char_traitslcESalcEEC1Ev

c++ - 为什么需要为每个 Visual C++ 版本构建特殊的库(二进制文件)?

c++ - 将只移动结构绑定(bind)到函数

c++ - 我只想在循环Qt中播放一个mp3文件

改变 RGB 颜色的亮度

c++ - visual studio 和 gcc 的 const 引用语法区别

c++ - 需要解释 C++ 代码的行为