gpt4 book ai didi

c++ - 使用 AVX CPU 指令 : Poor performance without "/arch:AVX"

转载 作者:IT老高 更新时间:2023-10-28 14:01:47 26 4
gpt4 key购买 nike

我的 C++ 代码使用 SSE,现在我想改进它以支持 AVX(当它可用时)。因此,我检测 AVX 何时可用并调用使用 AVX 命令的函数。我使用 Win7 SP1 + VS2010 SP1 和带有 AVX 的 CPU。

要使用 AVX,必须包含以下内容:

#include "immintrin.h"

然后您可以使用内在的 AVX 函数,例如 _mm256_mul_ps_mm256_add_ps 等。问题是,默认情况下,VS2010 生成的代码运行非常缓慢并显示警告:

warning C4752: found Intel(R) Advanced Vector Extensions; consider using /arch:AVX

看起来 VS2010 实际上不使用 AVX 指令,而是模拟它们。我在编译器选项中添加了 /arch:AVX 并得到了很好的结果。但是这个选项告诉编译器尽可能在任何地方使用 AVX 命令。所以我的代码可能会在不支持 AVX 的 CPU 上崩溃!

所以问题是如何让 VS2010 编译器生成 AVX 代码,但只有当我直接指定 AVX 内部函数时。对于 SSE,它可以工作,我只使用 SSE 内在函数,它生成的 SSE 代码没有任何编译器选项,如 /arch:SSE。但是对于 AVX,由于某种原因它不起作用。

最佳答案

2021 年更新:即使在没有 /arch:AVX 的情况下编译 AVX 内部函数时,现代版本的 MSVC 也不需要手动使用 _mm256_zeroupper()。 VS2010 做到了。


您看到的行为是昂贵的状态切换的结果。

参见 Agner Fog 手册的第 102 页:

http://www.agner.org/optimize/microarchitecture.pdf

每次您在 SSE 和 AVX 指令之间不正确地来回切换时,您都会付出极高 (~70) 周期的代价。

当您在不使用 /arch:AVX 的情况下进行编译时,VS2010 将生成 SSE 指令,但在您拥有 AVX 内部函数的任何地方仍会使用 AVX。因此,您将获得同时具有 SSE 和 AVX 指令的代码 - 这将具有这些状态切换惩罚。 (VS2010 知道这一点,因此它会发出您所看到的警告。)

因此,您应该使用全部 SSE 或全部 AVX。指定 /arch:AVX 告诉编译器使用所有 AVX。

听起来您正在尝试创建多个代码路径:一个用于 SSE,一个用于 AVX。为此,我建议您将 SSE 和 AVX 代码分成两个不同的编译单元。 (一个用 /arch:AVX 编译,一个不编译)然后将它们链接在一起并根据运行的硬件创建一个调度程序。

如果您需要混合 SSE 和 AVX,请务必使用 _mm256_zeroupper()_mm256_zeroall() 适本地避免状态转换的惩罚。

关于c++ - 使用 AVX CPU 指令 : Poor performance without "/arch:AVX",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7839925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com