windows - 是否有可能在 AVX/SSE 中获得多个正弦波?

标签 windows x86-64 trigonometry sse avx

我正在尝试编写一个 C++ 程序,它启动一个我在 x64 汇编器中编写的函数。 我想稍微加快速度(并使用 CPU 功能),所以我选择使用矢量运算。

问题是,我必须将正弦乘以一个整数,所以我必须先计算正弦。 是否可以在 SSE/AVX 中执行此操作?我知道指令 fsin,但它不仅在 FPU 中,而且一次只计算 1 个正弦。所以我必须将它压入 FPU,调用 fsin,将它从 FPU 弹出到内存,然后将它放入 AVX 寄存器。在我看来,这不值得麻烦。

最佳答案

是的,有一个使用 SSE/AVX 的矢量版本! 但问题是必须使用 Intel C++ 编译器。

这叫做 Intel 小型矢量数学库(内在函数):

对于 128 位 SSE,请使用( double ):_mm_sin_pd

对于 256 位 AVX,请使用( double ):_mm256_sin_pd

这两个内部函数实际上是非常小的函数,由手写的 SSE/AVX 程序集组成,现在您可以使用 AVX 一次处理 4 个正弦计算 :=) 延迟约为 10 个时钟周期(如果我没记错的话)在 Haswell CPU 上。

顺便说一句,CPU 需要执行大约 100 个这样的内部函数来预热并达到其最佳性能,如果只需要评估几个 sin 函数,最好使用普通的 sin() 代替。

祝你好运!

关于windows - 是否有可能在 AVX/SSE 中获得多个正弦波?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27933355/

相关文章:

javascript - 在同心圆上绘制点

windows - 如何在批处理文件中(递归地)分割目录地址?

windows - Windows XP 上的 Vc++ 2012 Express

C++11 字 rune 字 '\xC4' 标准类型与 UTF-8 执行字符集?

macos - 我在 ASM 中的 strdup

java - 坐标网格中球的真实反弹(离线)

javascript - 查找落在填充 Canvas 弧内的 x/y 坐标

Java - 无法加密 RDP 文件中的 Windows 远程桌面密码

c++ - 确定核心 i5/7 架构上的程序运行时间

caching - 缓存集和标签