我正在使用AVX指令集在VC++中编写前馈网络,并通过C#中的PInvoke调用此代码。当调用计算包括函数exp()的大循环的函数时,循环大小为160M,我的性能约为1000ms。但是,一旦调用了任何使用AVX指令集的函数,然后随后使用exp(),我的性能会降至相同操作的大约8000ms左右。请注意,计算exp()的函数是标准C,而使用AVX指令集的调用可以在数据被处理方面完全不相关。某种标志在运行时被触发。换句话说,
或者,奇怪的是,
A(); // 1000ms calculates 160M exp()
B(); // completely unrelated but contains AVX
A(); // 8000ms
或者,奇怪的是,
C(); // contains 128 bit SSE SIMD expressions
A(); // 1000ms
我对这里可能发生的机制或如何解决问题感到困惑。我的电脑是Intel 2500K CPU和Windows 7操作系统,我使用的是VS Express版本。
谢谢。
VZEROUPPER
。同时,请务必向编译器提交错误报告,以尝试让它在这些情况下自动插入该指令。 - Stephen Canon