Agenda
๏ Introdução
๏ Código Vetorial
๏ Vetorização Manual
๏ Vetorização Automática
๏ Superword Level Paralelism (SLP)
Introdução๏ Processadores vetoriais na década de 70.
๏ Instruções SIMD.
๏ Necessidade de compiladores.
๏ Compilador pode descobrir operações vetoriais automáticamente.
๏ Paralelismo no código gera oportunidade de vetorização.
Introdução
๏ Paralelismo aparece de várias formas.
๏ Década de 90 conjuntos de instruções vetoriais aparecem como extensões de multimedia, HP MAX-1 e Intel MMX.
๏ Mecanismos tradicionais de vetorização se aplicam para estas extensões.
Código Vetorial
๏ Instruções vetoriais.
๏ Operandos são registradores vetoriais ou escalares.
๏ Stride: tamanho de cada elemento do vetor
๏ Step: tamanho do registrador vetorial
Código Vetorial๏ Motivação
๏ Subutilização de registradores
๏ Acessos a memória desnecessários
๏ Exemplo: Operações com cores
๏ Soma
๏ Saturação
๏ Mapeamento de canais em vetores
Código Vetorial
๏ Operações de aritmética, lógicas
๏ Instruções especiais
๏ Empacotamento/Desempacotamento
๏ Operações Horizontais (Redução)
Vetorização Manual๏ Vetorização pode ser feita de maneira
manual no compilador.
๏ Invocação de rotinas escritas em assembly ou Inline Assembly em C/C++
๏ Utilização de Intrinsics
๏ Genéricos
๏ Específicos de Arquitetura
Vetorização Automática
๏ Abordagem mais comum utiliza diversas análises e truques em laços.
๏ Superword level paralelism (SLP).
๏ Necessitam diversas análises.
Dependência de Dados
๏ Três tipos de dependência:
๏ Flow (RAW)
๏ Anti (WAR)
๏ Output (WAW)
๏ Loop carried
๏ Loop independent
Vetorização de laços
๏ Primeira formalização de técnica de vetorização automática.
๏ Execução vetorial preserva dependência.
๏ Apenas laços que contêm dependências acíclicas podem ser vetorizados.
Strip-Mining๏ Cada arquitetura possui tamanho de
registradores vetoriais diferentes.
๏ Possibilita melhor utilização dos registradores.
๏ Divide o laço original em 2 novos laços.
๏ de fora: caminha entre passos
๏ interno: caminha entre iterações únicas de um passo
Redução๏ Operações horizontais.
๏ Se houver suporte a instruções horizontais
๏ Substituir diretamente
๏ Reduzição para cada passo e depois redução geral.
๏ Caso não, somar cada passo e somar sequencialmente o vetor final.
Condicionais๏ Tratamento de condicionais.
๏ Solução com vetores de bits e instruções com predicato.
๏ store, load e add adicionais.
๏ fluxo condicional sem branches.
๏ condição implícita na própria instrução.
๏ Na ausência de instruções condicionais, gerar os dois caminhos.
Expansão de Escalares
๏ Presença de escalares em um laço, gera dependência cíclica.
๏ No mínimo há dependência de saída.
๏ Variáveis de indução e temporários.
๏ Cíclos devem ser removidos para se aplicar vetorização.
Expansão de Escalares๏ Variáveis de indução
๏ Substituição
๏ Temporários
๏ Expansão escalar
๏ Temporários mantidos em registradores vetoriais, o valor de cada posição do registrador deverá conter o valor do escalar em diferentes iterações.
Abordagens com ciclos
๏ Dependência com ciclos impossibilita vetorização.
๏ Vários truques podem ser aplicados permitindo vetorização (mesmo que parcial)
Loop fission๏ Utilizado para vetorizar loops parcialmente.
๏ Quebra laço em 2 novos laços.
๏ Um deles é vetorizado.
Loop fission๏ Caso haja um temporário que ficaria em
ambos loops, evitar alocação.
๏ Expandir e aplicar strip-mining.
Loop fission
๏ Na presença de condicionais em laços.
๏ Fora do ciclo:
๏ Técnica mostrada anteriormente.
๏ Parte do ciclo:
๏ Necessitaria de suporte em hardware para resolver recorrência booleana.
Ciclos Falsos
๏ Ciclos de antidependência.
๏ Dependência falsa
๏ Em baixa granularidade existe dependência.
๏ Dependência não existe em baixa granularidade.
Ciclos Falsos๏ Considerar grafo com alta granularidade.
๏ Ordenação topológica para reordenar as operações.
๏ Garante que o fetch de a[i+1] é realizado antes da escrita de a[i]
Dependência Cruzada
๏ Em uma operação vetorial um dos operandos contêm índice crescente a outra descrenscente.
๏ Aplicar técnica de index set splitting, descobrindo índice de encontro
๏ Divide em outros dois laços,
Tempo de Execução
๏ Um dos subscripts não é conhecido em tempo de execução.
๏ Não se sabe a direção da dependência.
๏ Gerar 2 versões do laço, uma para indices positivos e outra negativos
Otimizações
๏ Ciclos com dependência de saída.
๏ Se o valor guardado for invariante e o mesmo em todas sentenças.
๏ Ignorar ciclos.
Laços Aninhados
๏ Se não existirem ciclos.
๏ Todos laços podem ser vetorizados.
๏ Transformação fica equivalente a atribuição de arrays.
Laços Aninhados
๏ Se um dos laços possuirem ciclos de dependência.
๏ Loop interchanging.
๏ Inverte os laços, joga o ciclo para o laço de fora e paraleliza o interno.
๏ Permite escolher o melhor laço para vetorização.
Superword Level Paralelism (SLP)
๏ Técnicas em laços complexas e frágeis.
๏ Algumas funcionam para casos muito específicos.
๏ SLP explora o descoberta de operações SIMD analisando blocos básicos.
SLP
๏ Sentenças semelhantes sao agregadas em instruções SIMD.
๏ Sentenças isomórficas são escolhidas em um bloco básico.
๏ Sentenças isomórficas são as que possuem as mesmas operações na mesma ordem.
SLP๏ Definições
๏ Pack : tupla que contem sentenças isomórficas independentes em um BB.
๏ PackSet : é um conjunto de Packs.
๏ Pair : Pack de tamanho 2.
๏ 1a sentença : left element
๏ 2a sentença : right element
SLP๏ Antes do algoritmo executar :
๏ Loop unrolling, transforma paralelismo de vetores em SLP
๏ Alignment Analysis, cuida do endereçamento de cada instrução.
๏ Renaming
๏ Otimizações tradicionais: DCE, CSE, ...
SLP๏ Algoritmo
๏ Escolher os primeiros candidatos a empacotamento:
๏ Referências adjacentes de memória
๏ Array analysis e informação de alinhamento
๏ Buscar essas sentenças em todos BBs.
SLP๏ Após a incialização, adicionam-se mais
canditados que:
๏ Produzirem operandos fonte para outras sentenças já no PackSet.
๏ Utilizar dados já empacotados como operandos.
๏ Varrer def-use e use-def dos elementos já presentes no PackSet.
SLP๏ As novas sentenças encontradas devem:
๏ Serem isomórficas e independentes.
๏ Serem o lado esq/dir de grupos cujos lados a esq/dir ainda não estão no PackSet.
๏ Informação de alinhamento consistente.
๏ Tempo de execução novo deve ser menor do que a versão sequencial.
SLP
๏ Após selecionar todas sentenças possíveis:
๏ Pares podem ser combinados em sentenças maiores.
๏ Podem ser combinados quando o lado esquerdo de um grupo é igual ao lado direito de outro (elimina repetições).
SLP
๏ Análise de dependência garante que todas setenças em um grupo podem executar em paralelo.
๏ Dois grupos podem produzir violação de dependência, caso ocorra ciclo entre eles.
๏ Grupo contendo a sentença mais recente que ainda não foi escalonada é dividido.
Conclusão
๏ Vetorização, primeiro método de explorar paralelismo em laços.
๏ Utilização inicial em processadores vetoriais e hoje com extensões multimedia
๏ Aplicação em laços e SLP
๏ Mesmo antigas, ainda geram muito desempenho quando implementadas.
Top Related