pyt*_*nic 4 c c++ gcc avx avx2
基本上,我该如何使用AVX2内部函数编写等效的代码?我们在此假设result_in_float类型为__m256,而result类型为short int*或short int[8]。
for(i = 0; i < 8; i++)
result[i] = (short int)result_in_float[i];
Run Code Online (Sandbox Code Playgroud)
我知道可以使用__m256i _mm256_cvtps_epi32(__m256 m1)内在函数将浮点数转换为32位整数,但不知道如何将这些32位整数进一步转换为16位整数。而且我不仅想要这样,而且还要将这些值(以16位整数的形式)存储到内存中,而我想全部使用矢量指令来完成。
在Internet上搜索时,我发现了一个名为的内在函数_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
Run Code Online (Sandbox Code Playgroud)
最后一步(广播)是免费的,只需更改类型即可。
如果您有两个要转换的浮点向量,则可以重复使用大多数指令,例如:(也未经测试)
__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
Run Code Online (Sandbox Code Playgroud)