修改的SSE版本
SSE version of modf
我有以下使用 SSE 内部函数的 modf
工作实现,但是当我需要将结果作为__m128
时,在此过程中转换为 __m128i
并返回似乎很浪费。
__m128 integer = _mm_cvtepi32_ps(_mm_cvttps_epi32(value));
__m128 fraction = _mm_sub_ps(value, integer);
是否存在没有类型转换或一些幻数破解的截断指令?
在 SSE4.1 中,您可以使用roundps
和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,那么除了转换或执行+/-魔术之外,没有更好的方法可以做到这一点。(在溢出的情况下,两者都会遇到问题(
相关文章:
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 导入库可以跨dll版本工作吗
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 不同的Visual Studio版本中缺少.dll
- 用符号版本替换对函数的所有调用
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 我需要分发哪些版本的可再分发文件
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- 在运行时读取 libstdc++ 版本
- 如何声明一个可以在整个程序中使用的全局 2d 3d 4d .. 数组(堆版本)变量?
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- Vulkan SDK 版本 1.1.85.0 在 Kubuntu 18.10 上链接
- 如何正确实现与基类不同的版本?
- 编写 std::copysign 的可移植 SSE/AVX 版本
- 修改的SSE版本
- SSE版本的结果不同
- SSE版本差分平方和算法的累积计算误差