我有这个大型库,包含常规C ++,大量SSE内在函数和一些无关紧要的程序集。我已达到了我想要定位AVX指令集的程度。
要做到这一点,我想用gcc' -mavx
或MSVC /arch:AVX
来构建整个内容,这样我就可以在任何需要的地方添加AVX内在函数而不是在内部担心AVX状态转换。
我发现的唯一问题是标准C数学函数:sin()
,exp()
等。它们在Linux系统上的实现使用没有VEX前缀的SSE指令。我没有检查过,但我期望在Windows上遇到类似的问题。
代码使用了大量的数学函数调用。一些快速基准测试显示一个简单的调用,因此sin()
要么稍微(~10%)慢一点,要么慢多少(3x),这取决于确切的CPU以及它如何处理AVX转换(Skylake与旧版本)。
在通话之前添加VZEROUPPER
有助于预先设置Skylake CPU,但实际上使Skylake上的代码变慢了一些。似乎正确的解决方案是数学函数的VEX编码版本。
所以我的问题是:是否有一个合理有效的数学库可以编译为使用VEX编码指令?其他人如何处理这个问题?