gpt4 book ai didi

c++ - SSE版本的modf

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:25 25 4
gpt4 key购买 nike

我有以下使用 SSE 内在函数的 modf 的工作实现,但是当我需要结果时转换为 __m128i 并返回过程似乎很浪费作为 __m128

__m128 integer = _mm_cvtepi32_ps(_mm_cvttps_epi32(value));
__m128 fraction = _mm_sub_ps(value, integer);

是否存在不进行类型转换或一些魔术数字破解的截断指令?

最佳答案

通过 SSE4.1,您可以使用 roundps and roundpd说明:

//  Single Precision
__m128 integer = _mm_round_ps(value,_MM_FROUND_TRUNC);
__m128 fraction = _mm_sub_ps(value,integer);

// Double Precision
__m128d integer = _mm_round_pd(value,_MM_FROUND_TRUNC);
__m128d fraction = _mm_sub_pd(value,integer);

这将分隔整数和小数部分,同时保留它们的符号。

同样,对于 AVX:

//  Single Precision
__m256 integer = _mm256_round_ps(value,_MM_FROUND_TRUNC);
__m256 fraction = _mm256_sub_ps(value,integer);

// Double Precision
__m256d integer = _mm256_round_pd(value,_MM_FROUND_TRUNC);
__m256d fraction = _mm256_sub_pd(value,integer);

如果你也有 XOP 指令集,你可以只用一条指令(通过 _mm256_frcz_pd 和 family)单独得到小数部分。

但是如果没有 SSE4.1,那么除了转换或执行 +/- 魔术数字技巧之外,没有更好的方法来实现它。 (两者在溢出的情况下都会遇到问题)

关于c++ - SSE版本的modf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19339043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com