基本上我如何使用 AVX2 内在函数编写与此等效的内容?我们在这里假设result_in_float
属于类型__m256
, while result
属于类型short int*
or short int[8]
.
for(i = 0; i < 8; i++)
result[i] = (short int)result_in_float[i];
我知道浮点数可以使用以下命令转换为 32 位整数__m256i _mm256_cvtps_epi32(__m256 m1)
固有的,但不知道如何将这些 32 位整数进一步转换为 16 位整数。我不仅想要这样,还想要将这些值(以 16 位整数的形式)存储到内存中,并且我想使用向量指令来完成这一切。
在互联网上搜索,我发现了一个名为_mm256_mask_storeu_epi16
,但我不太确定这是否有效,因为我找不到其用法的示例。
_mm256_cvtps_epi32
是一个很好的第一步,转换为压缩的短裤向量有点烦人,需要跨切片洗牌(所以最好它不在依赖链中)。
由于可以假设这些值在正确的范围内(根据注释),我们可以使用_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
最后一步(强制转换)是免费的,它只是改变类型。
如果您有两个浮点向量要转换,您可以重复使用大部分指令,例如:(也未测试)
__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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)