gpt4 book ai didi

clang - Clang是否有类似#pragma GCC目标的内容?

转载 作者:行者123 更新时间:2023-12-04 03:42:14 27 4
gpt4 key购买 nike

我编写了一些代码,这些代码在当前CPU上可用时使用AVX内部函数。在GCC和Clang中,与Visual C ++不同,要使用内部函数,必须在命令行上启用它们。

GCC和Clang的问题在于,启用这些选项后,您将赋予编译器自由使用权,以在源文件中的任何地方使用这些指令。当头文件包含内联函数或模板函数时,这是非常糟糕的,因为编译器将使用AVX指令生成这些函数。

链接时,重复的功能将被丢弃。但是,由于某些源文件是使用-mavx编译的,而有些不是使用#pragma GCC target编译的,因此内联/模板函数的各种编译将有所不同。如果您不走运,链接器将随机选择具有AVX指令的版本,从而导致该程序在没有AVX的系统上运行时崩溃。

GCC用 解决了这个问题。您可以关闭头文件的特殊说明,并且生成的代码将不使用AVX:

#pragma GCC push_options
#pragma GCC target("no-avx")

#include "MyHeader.h"

#pragma GCC pop_options


Clang有这样的东西吗?似乎忽略了这些选项并始终生成AVX代码。

最佳答案

您可能应该使用static inline而不是inline,所以使用-mavx编译的函数的版本将仅由该翻译单元的调用者使用。

链接器仍将合并实际的重复项,而不是仅按名称选择一个非内联定义。

这还有一个优点,就是编译器不会浪费时间为它决定内联到该转换单元中的每个调用程序中的函数发出独立的定义。



如果您习惯了gcc / clang方式并为其设计代码,那么gcc / clang方式才有意义。请注意,如果要编译使用AVX的函数,则MSVC需要启用AVX。否则,它将混合使用VEX和非VEX编码,从而导致较大的损失,而不是在_mm_add_ps循环末尾的水平添加中对诸如128位_mm256_add_ps之类的东西使用VEX编码。

因此,MSVC基本上存在相同的问题,即编译_mm_whatever将使仅AVX的机器代码成为可能。

关于clang - Clang是否有类似#pragma GCC目标的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46165752/

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