gpt4 book ai didi

c - gcc:用 `-mavx -mprefer-avx128`优化单个函数

转载 作者:行者123 更新时间:2023-12-03 07:57:11 27 4
gpt4 key购买 nike

我想使用 -mavx -mprefer-avx128 优化单个函数。基本上任何代码都不应使用 AVX,除了其中一个函数:该函数应使用 AVX128。

我尝试过这些事情:

__attribute__((target("avx")))
void f() { ... }

=> 似乎使用 avx2

__attribute__((target("prefer-avx128")))
void f() { ... }

=> 无法编译

__attribute__((target("avx")))
__attribute__((optimize("prefer-avx128")))
void f() { ... }

=> 无法编译

也许有人知道如何做到这一点?

最佳答案

-mprefer-avx128 ,它是现代替代品-mprefer-vector-width=128 ,是-m选项,而不是-f ,所以他们只能使用 target("string")而不是optimize("string")属性。

但实际上只有一些-m选项作为属性; GCC manual's list of x86 target attributes主要是 ISA 扩展,arch=tune= ,还包括prefer-vector-width=OPT 。没有一个基于旧选项 -mprefer-avx128 ;可能在 -mprefer-avx128 之后添加了对属性的支持已被 -mprefer-vector-width 取代选项。

__attribute__((target("avx,prefer-vector-width=128")))

这将启用 AVX(仅限 AVX1,而不是 AVX2),并针对 128 位自动矢量化进行调整。由于整数代码更容易自动矢量化,因此我实际上使用 AVX2 进行了测试:

__attribute__((target("avx2,prefer-vector-width=128")))
unsigned foo(unsigned *arr){
unsigned sum=0;
for(int i=0 ; i<10240; i++) {
sum += arr[i];
}
return sum;
}

__attribute__((target("avx2")))
unsigned bar(unsigned *arr){
unsigned sum=0;
for(int i=0 ; i<10240; i++) {
sum += arr[i];
}
return sum;
}

编译为gcc -O3 -mtune=haswell ( Godbolt ),第一个版本使用 vpaddd xmm ,第二个使用 vpaddd ymm 。 (tune=haswell 将法线 vector 宽度首选项设置为 256。)


术语:AVX1 支持 256 位 vector 宽度的 FP 运算,例如 vaddps .
AVX2 是 256 位整数运算,例如 vpaddb ymm ,以及粒度比 128 位更细的交叉车道洗牌,如 vpermps/vpermq .

__attribute__((target("avx")))如果您尚未在命令行上或使用较早的 #pragma GCC target 启用它们,则绝对不会使用 AVX2 指令

关于c - gcc:用 `-mavx -mprefer-avx128`优化单个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75761659/

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