我有这个大型库,其中混合了常规 C++、许多 SSE 内在函数和一些无关紧要的程序集。我已经达到了我想以 AVX 指令集为目标的地步。
为此,我想用 gcc-mavx
或 MSVC构建整个东西,/arch:AVX
这样我就可以在任何需要的地方添加 AVX 内在函数,而不必担心内部的 AVX 状态转换。
我发现的唯一问题是标准 C 数学函数:sin()
,exp()
等。它们在 linux 系统上的实现使用没有 VEX 前缀的 SSE 指令。我还没有检查过,但我预计 Windows 上会出现类似的问题。
该代码使用了大量对数学函数的调用。一些快速的基准测试表明,一个简单的调用sin()
会稍微慢一些(~10%)或慢很多(3x),具体取决于确切的 CPU 以及它如何处理 AVX 转换(Skylake 与旧版本)。
VZEROUPPER
在调用之前添加 a对 Skylake CPU 有很大帮助,但实际上会使 Skylake 上的代码变慢一些。似乎正确的解决方案是数学函数的 VEX 编码版本。
所以我的问题是:是否有一个相当有效的数学库可以编译为使用 VEX 编码指令?其他人如何处理这个问题?