使用AVX指令会禁用exp()优化吗?

| 我正在使用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 \ Win7。VS的Express版本。 谢谢。     
已邀请:
如果使用任何AVX256指令,则\“ AVX高状态\”将变为\“脏\”,如果随后使用SSE指令(包括在xmm寄存器中执行的标量浮点),则会导致较大的停顿。英特尔优化手册中对此进行了说明,您可以免费下载该手册(如果您要进行此类工作,则必须阅读):   AVX指令始终会修改YMM寄存器的高位,而SSE指令不会修改YMM寄存器的高位。从硬件的角度来看,可以将YMM寄存器集合的高位视为三种状态之一:      •清除:YMM的所有高位为零。这是处理器从RESET启动时的状态。      •修改并保存到XSAVE区域YMM寄存器的高位内容与XSAVE区域中保存的数据匹配。 XSAVE / XRSTOR执行后,就会发生这种情况。      •已修改且未保存:执行一条AVX指令(256位或128位)会修改目标YMM的高位。      只要处理器状态为“修改且未保存”,就会应用AVX / SSE过渡惩罚。使用VZEROUPPER将处理器状态移至“清洁”并避免过渡损失。 例行程序
B( )
弄脏了YMM状态,因此
A( )
中的SSE代码停滞了。在
B
A
之间插入
VZEROUPPER
指令可避免此问题。     

要回复问题请先登录注册