- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 -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/
当我使用 GCC 并设置命令行参数 -mavx 时,编译器将自动在源代码中定义 __AVX__。 这样我就可以检测项目是否是使用 AVX 指令构建的,如果没有则回退到另一个代码路径。 有没有办法用 C
编辑 下面的部分解决方案(编辑 2),但我还有一个问题(见最后) 我正在尝试使用 gcc-4.9.2 编译以下 C 程序,在 Windows 7 上,32 位,在 Pentium G3220 上运行(
我想使用 -mavx -mprefer-avx128 优化单个函数。基本上任何代码都不应使用 AVX,除了其中一个函数:该函数应使用 AVX128。 我尝试过这些事情: __attribute__((
根据这个question我认为在 C++17 中,带有默认分配器的 std::vector 应该处理对齐类型。但是,下面的代码 #include #include #include #inclu
如何使用 AVX 和 FMA 指令禁用自动矢量化?我仍然希望编译器自动使用 SSE 和 SSE2,而不是 FMA 和 AVX。 我的代码使用 AVX 检查其可用性,但 GCC 在自动矢量化时不这样做。
我有一个编译成静态库的 c 和 c++ 混合大型代码。我从给定程序的 simgms 静态库中调用函数 -main.cpp 很简单,但可执行文件不会运行并抛出运行时错误非法指令。 gdb 在第一行 -
我是一名优秀的程序员,十分优秀!