c++ - 在非 Haswell 处理器上禁用 AVX2 功能

标签 c++ sse avx2

我编写了一些在 Haswell i7 处理器上运行的 AVX2 代码。相同的代码库也用于非 Haswell 处理器,其中相同的代码应替换为它们的 SSE 等效项。我想知道编译器是否有办法忽略非 Haswell 处理器上的 AVX2 指令。我需要这样的东西:

public void useSSEorAVX(...){
    IF (compiler directive detected AVX2)
        AVX2 code (this part is ready)
    ELSE
        SSE code  (this part is also ready)
    }
}

现在我正在编译之前注释掉相关代码,但必须有一些更有效的方法来做到这一点。我正在使用 Ubuntu 和 gcc。感谢您的帮助。

最佳答案

除非万不得已,否则我认为制作单独的可执行文件不是一个好主意。在您的情况下,您可以制作一个 CPU 调度程序。我最近为 GCC 和 Visual Studio 做了这个。

假设您有一个用于 SSE 和 AVX 的名为 product 的函数。您将 SSE 版本放在文件 product_SSE.cpp 中,将 AVX2 版本放在文件 product_AVX2.cpp 中。您分别编译每一个(例如使用 -msse2-mavx2)。然后像这样制作一个模块:

extern "C" void product_SSE(float *a, float *b, float *c, int n);
extern "C" void product_AVX2(float *a, float *b, float *c, int n); 
           void product_dispatch(float *a, float *b, float *c, int n); 
void (*fp)(float* a, float *b, float *c, int n) = product_dispatch;

inline void product_dispatch(float *a, float *b, float *c, int n) {
    int iset = instrset_detect();
    if(iset==8) {
        fp = product_AVX2
    }
    else {
        fp = product_SSE
    }
    fp(a,b,c,n);
}

inline void product(float *a, float *b, float*c, int bs) {
    fp(a,b,c,n);
}

您使用较低的通用指令集(例如使用 SSE2)编译该模块。现在,当您调用产品时,它首先调用 product_dispatch 将函数指针 fp 设置为 product_AVX2product_SSE,然后调用来自函数指针的函数。第二次调用 product 时,它会直接跳转到 product_AVX2product_SSE。这样您就不必拥有单独的可执行文件。

关于c++ - 在非 Haswell 处理器上禁用 AVX2 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23676426/

相关文章:

c++ - Clang 提示未评估的上下文中未定义的 constexpr 函数

c++ - Operator<< 重载,endl导致segmentation fault

c++ - 为什么两个连续的收集指令比等效的基本操作执行得更差?

visual-c++ - clang-cl 和 arch :avx2? 是否存在兼容性问题

c++ - 为什么我在写 = 而不是 == 时没有收到警告?

c++ - 在访问 struct 的不同属性的 C++ 函数中重用代码

assembly - 获取 16 或 32 字节固定大小缓冲区的 C 字符串长度? (XMM 或 YMM 寄存器宽度)

c++ - 对齐类型和按值传递参数

c - 使用 SSE 反转字符串