Como vetorizar com gcc?
-
03-07-2019 - |
Pergunta
A série v4 do compilador gcc
pode automaticamente vectorize laços usando o href="http://en.wikipedia.org/wiki/SIMD" rel="nofollow noreferrer"> SIMD processador em algum CPUs modernas, como o AMD Athlon ou chips Intel Pentium / núcleo. Como isso é feito?
Solução
Os originais detalhes página oferece sobre como obter gcc para automaticamente vectorize loops, incluindo alguns exemplos:
http://gcc.gnu.org/projects/tree-ssa /vectorization.html
Embora os exemplos são grandes, verifica-se a sintaxe para chamar essas opções com as mais recentes GCC parece ter mudado um pouco, vê agora:
Em resumo, as seguintes opções irá trabalhar para x86 chips com SSE2, dando um log de loops que foram vetorizadas:
gcc -O2 -ftree-vectorize -msse2 -ftree-vectorizer-verbose=5
Note que -msse também é uma possibilidade, mas ela só vai vetorizar loops de usando carros alegóricos, não duplica ou ints.
Outras dicas
Há uma Gimple (uma representação intermediária de GCC) passe pass_vectorize
. Esta passagem vai permitir auto-vetorização a nível Gimple.
Para habilitar autovectorization (V4.4.0 GCC), precisamos seguintes etapas:
- Mencione o número de palavras em um vector de acordo com a arquitetura alvo. Isto pode ser feito através da definição do
UNITS_PER_SIMD_WORD
macro. - Os modos de vetor que são possíveis necessidades a serem definidas em um arquivo separado normalmente
<target>-modes.def
. Este arquivo deve residir no diretório onde outros arquivos contendo as descrições de máquinas estão residindo em. (De acordo com o script de configuração. Se você pode mudar o script que você pode colocar o arquivo em qualquer diretório que você quer que ele seja in). -
Os modos que devem ser considerados para vetorização de acordo com arquitetura alvo. Como, 4 palavras constituirão um vetor ou oito meias palavras constituirão um vetor ou dois palavras duplas constituirão um vetor. Os detalhes da Isso precisa ser mencionado no arquivo
<target>-modes.def
. Por exemplo:VECTOR_MODES (INT, 8); /* V8QI V4HI V2SI /
VECTOR_MODES (INT, 16); / V16QI V8HI V4SI V2DI /
VECTOR_MODES (FLOAT, 8); / V4HF V2SF */ -
Criar a porta. Vetorização pode ser ativado usando as opções de linha de comando
-O2 -ftree-vectorize
.