我正在使用 AVX 内在函数在 VC++ 中编写前馈网络。我通过 C# 中的 PInvoke 调用此代码。我在调用计算包含函数 exp() 的大循环的函数时的性能约为 1000 毫秒,循环大小为 160M。一旦我调用任何使用 AVX 内在函数的函数,然后使用 exp(),对于相同的操作,我的性能下降到大约 8000 毫秒。请注意,计算 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\Win 7. Express 版本的 VS 上。
谢谢。