如何用-mavx -mprefer-avx128仅优化单个函数并限定使用AVX128?
解决方案
要实现仅单个函数使用AVX128优化、其余代码不启用AVX的需求,正确的写法是将avx和prefer-avx128合并到同一个target属性中,具体代码如下:
__attribute__((target("avx,prefer-avx128"))) void f() { // 函数实现 }
之前尝试失败的原因:
- 单独使用
target("avx")时,编译器在支持AVX2的环境下会默认生成AVX2指令(AVX是AVX2的子集,编译器会优先选用更高效的指令集),因此你会看到AVX2相关代码。 - 单独使用
target("prefer-avx128")不合法,因为prefer-avx128是依赖AVX指令集的附加选项,必须先启用AVX才能生效。 - 用
optimize("prefer-avx128")无效,因为prefer-avx128不属于通用优化选项,它是目标指令集的控制参数,必须放在target属性中。
额外注意事项:
- 编译全局代码时不要添加
-mavx或相关AVX编译选项,确保只有标记了属性的函数启用AVX。 - 该写法兼容GCC 5.0及以上版本,Clang也支持相同语法。
内容的提问来源于stack exchange,提问作者Kevin Meier
相关产品推荐
相关产品推荐

