FERRAMENTAS LINUX: O GCC obtém uma vetorização totalmente mascarada do AVX-512

terça-feira, 20 de junho de 2023

O GCC obtém uma vetorização totalmente mascarada do AVX-512

 

Com base na análise do binário de codificação de vídeo x264 gerado e em algumas ineficiências de desempenho, os engenheiros da SUSE desenvolveram o suporte de vetorização totalmente mascarada AVX-512 para o código de desenvolvimento GCC 14.


Em janeiro, o engenheiro de compilador da SUSE, Jan Hubicka, relatou um bug no benchmark x264, onde o loop de média não estava sendo otimizado corretamente para AVX-512.

"O benchmark x264 possui um loop que realiza a média de duas matrizes de caracteres não assinados e que é executado com contagens de iterações relativamente baixas, o que não se beneficia do nosso código vetorizado. Para o AVX512, a maior parte do tempo é gasta na versão não vetorizada, pois o número médio de iterações é muito pequeno para ativar o código vetorial. [...]

Para tamanhos de 12-16 bytes, a vetorização de 128 bits é mais eficiente, mas para tamanhos de 20-28 bytes, o comportamento é inconsistente. No entanto, a vetorização AVX-512 apresenta um desempenho ruim para todos os tamanhos de até 31 bytes. A versão aocc tem melhor desempenho para 16 bytes. [...] Um problema é que só realizamos a vetorização do loop principal, portanto, com AVX-512, o epílogo do loop é vetorizado com AVX2, mas o epílogo em si não é vetorizado. Com AVX-512, gostaríamos de usar um epílogo totalmente mascarado usando AVX-512."

Jan Hubicka iniciou o trabalho no suporte de vetorização totalmente mascarada para o AVX-512, mas acabou se distraindo. 

Esse Avanco de quase seis meses e o engenheiro de compilador da SUSE, Richard Biener, conseguiu implementar uma versão inicial da vetorização totalmente mascarada do AVX-512 na base de código do GNU Compiler Collection, a fim de melhorar o desempenho do caso de teste x264 e outros casos de vetores incompletos.

"Esta implementação permite a vetorização totalmente mascarada ou um epílogo mascarado para máscaras no estilo AVX-512, representando cada faixa com um único bit e usando modos inteiros para a máscara (semelhante ao gcn). O AVX-512 é especial porque não possui uma instrução para calcular a máscara de um escalar individual como o sve tem com while_ult. Em vez disso, as máscaras são geradas por meio de comparações vetoriais, e o controle do loop retém o escalar individual (principalmente para evitar dependências na geração da máscara, sendo que uma instrução de teste de máscara adequada está disponível).

Como a geração de código rvv prefere um escalar decrescente, embora o ivopts possa atrapalhar em alguns casos, o escalar é removido para eliminá-lo com um incremento usado para a geração de endereço.

Um dos casos de teste motivadores é o pr108410, que por sua vez é extraído do x264, onde a vetorização de tamanhos maiores apresenta problemas com loops de iterações pequenas. O tempo de execução melhora em comparação com o AVX-512 clássico com epílogos do AVX2 para os casos com menos de 32 iterações."

O suporte para a vetorização totalmente mascarada AVX-512 foi incorporado ontem de manhã no repositório Git do GCC 14 por meio deste commit.




Fonte

Até a próxima !!

Nenhum comentário:

Postar um comentário