gpt4 book ai didi

visual-c++ - 使用 AVX 指令会禁用 exp() 优化吗?

转载 作者:行者123 更新时间:2023-12-04 06:40:14 25 4
gpt4 key购买 nike

我正在使用 AVX 内在函数在 VC++ 中编写一个前馈网络。我正在通过 C# 中的 PInvoke 调用此代码。对于 160M 的循环大小,在调用计算包括函数 exp() 的大循环的函数时,我的性能约为 1000 毫秒。一旦我调用任何使用 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。

谢谢。

最佳答案

如果您使用任何 AVX256 指令,“AVX 上层状态”将变为“脏”,如果您随后使用 SSE 指令(包括在 xmm 寄存器中执行的标量浮点),这将导致大停顿。这在英特尔优化手册中有记录,您可以 download for free (如果你正在做这类工作,这是必读的):

AVX instruction always modifies the upper bits of YMM registers and SSE instructions do not modify the upper bits. From a hardware perspective, the upper bits of the YMM register collection can be considered to be in one of three states:

• Clean: All upper bits of YMM are zero. This is the state when processor starts from RESET.

• Modified and saved to XSAVE region The content of the upper bits of YMM registers matches saved data in XSAVE region. This happens when after XSAVE/XRSTOR executes.

• Modified and Unsaved: The execution of one AVX instruction (either 256-bit or 128-bit) modifies the upper bits of the destination YMM.

The AVX/SSE transition penalty applies whenever the processor states is “Modified and Unsaved“. Using VZEROUPPER move the processor states to “Clean“ and avoid the transition penalty.



您的日常 B( )弄脏了 YMM 状态,因此 A( ) 中的 SSE 代码摊位。插入一个 VZEROUPPER B之间的指令和 A以避免问题。

关于visual-c++ - 使用 AVX 指令会禁用 exp() 优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5852182/

25 4 0