我正在使用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
Run Code Online (Sandbox Code Playgroud)
或者,奇怪的是,
C(); // contains 128 bit SSE SIMD expressions
A(); // 1000ms
Run Code Online (Sandbox Code Playgroud)
我很遗憾这里有什么可能的机制,或者如何追求一个解决方案.我在英特尔2500K cpu\Win 7. Express版本的VS.
谢谢.