如何仅针对源代码的特定部分打开 -mavx2?

san*_*orn 4 c++ gcc clang intrinsics avx2

-march我可以强制编译器在代码的某些特定部分的设置之外编译一些内部函数吗?

当然,其余的还是在-march设定范围内。

是否可以-mavx2仅启用源代码的特定部分?

或者是我必须单独编译部分的唯一方法-mavx2

Fun*_*ino 5

尝试__attribute__((target("avx2")))GCCClang都支持它。

例子:

#include <stdlib.h>
#include <stdio.h>
#include <immintrin.h>

__attribute__((target("avx2")))
int add_with_avx2(int a, int b) {
    __m256i av = _mm256_set_epi32(a, 0, 0, 0, 0, 0, 0, 0);
    __m256i bv = _mm256_set_epi32(b, 0, 0, 0, 0, 0, 0, 0);
    __m256i result = _mm256_add_epi32(av, bv);
    return ((int*)&result)[7];
}

int main(void) {
    return add_with_avx2(5, 6);
}
Run Code Online (Sandbox Code Playgroud)

但是,最好将需要内在函数的函数放在单独的文件中,以防您需要使用不具有此功能的编译器。

  • 更重要的是,函数不能内联到具有不同目标属性的调用者中(即使使用链接时优化),因此仅在“足够大”的函数上使用它,而不是在单向量辅助函数上使用它。 (2认同)