SSE版本的modf

时间:2013-10-12 20:45:47

标签: c++ visual-c++ sse simd

我使用SSE内在函数实现了modf的以下工作实现,但是当我需要将结果作为{{1}时,转换到__m128i并返回过程似乎非常浪费}。

__m128

是否存在没有类型转换的截断指令,或者某些幻数黑客?

1 个答案:

答案 0 :(得分:4)

使用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和系列),就可以单独得到小数部分。

但是没有SSE4.1,除了转换或做+/-魔术数字技巧之外,没有更好的方法可以做到这一点。 (两者都会在溢出的情况下遇到问题)