ti-enxame.com

Como forço o gcc a incorporar uma função?

__attribute__((always_inline)) força uma função a ser incorporada pelo gcc?

53
HaltingState

Sim.

De documentação

always_inline

Geralmente, as funções não são incorporadas, a menos que a otimização seja especificada. Para funções declaradas em linha, esse atributo destaca a função mesmo que nenhum nível de otimização tenha sido especificado.

42
RCE

Deveria. Sou um grande fã de inlining manual. Claro, usado em excesso é uma coisa ruim. Mas muitas vezes, ao otimizar o código, haverá uma ou duas funções que simplesmente precisam ser incorporadas ou o desempenho diminui. E, francamente, na minha experiência, os compiladores C normalmente fazem não inline essas funções ao usar a palavra-chave inline.

Estou perfeitamente disposto a deixar o compilador incorporar a maior parte do meu código para mim. São apenas meia dúzia de casos absolutamente vitais que realmente me interessam. As pessoas dizem que "os compiladores fazem um bom trabalho nisso". Eu gostaria de ver a prova disso, por favor. Até agora, eu nunca vi um compilador C embutir um pedaço de código vital que eu disse sem usar algum tipo de sintaxe embutida forçada (__forceinline No msvc __attribute__((always_inline)) no gcc).

29
Joe

Sim vai. Isso não significa que é uma boa ideia.

24
jmkeyes

De acordo com a documentação opções de otimização do gcc , você pode ajustar o inlining com os parâmetros:

-finline-limit=n
By default, GCC limits the size of functions that can be inlined. This flag 
allows coarse control of this limit. n is the size of functions that can be 
inlined in number of  pseudo instructions.

Inlining is actually controlled by a number of parameters, which may be specified
individually by using --param name=value. The -finline-limit=n option sets some 
of these parameters as follows:

    max-inline-insns-single is set to n/2. 
    max-inline-insns-auto is set to n/2.

Eu sugiro ler mais detalhes sobre todos os parâmetros para embutir e configurá-los adequadamente.

11
Basile Starynkevitch

Sim. Ele incorporará a função independentemente de quaisquer outras opções definidas. Veja aqui .

3
Matt Joiner

Quero acrescentar aqui que tenho uma biblioteca matemática SIMD em que inlining é absolutamente crítico para o desempenho. Inicialmente, defino todas as funções como inline, mas a desmontagem mostrou que, mesmo para os operadores mais triviais, ele decidia realmente chamar a função. O MSVC e o Clang mostraram isso, com todos os sinalizadores de otimização ativados.

Eu fiz como sugerido em outras postagens em SO e adicionei __forceinline Para MSVC e __attribute__((always_inline)) para todos os outros compiladores. Houve uma melhoria consistente de 25 a 35% em desempenho em vários circuitos apertados, com operações que variam de multiplicações básicas a senos.

Eu não entendi por que eles tiveram tanta dificuldade em inserir (talvez o código de modelo seja mais difícil?), Mas o ponto principal é: existem casos de uso muito válidos para a inserção manual e enormes acelerações a serem obtidas.

Se você está curioso, é aqui que eu o implementei. https://github.com/redorav/hlslpp

1
RedOrav

Pode-se também usar __always_inline. Eu tenho usado isso para funções de membro C++ para o GCC 4.8.1. Mas não foi possível encontrar uma boa explicação no documento do GCC.

0
Jie Xu