Pergunta

Alguém aproveitado a vetorização automática que gcc pode fazer? No mundo real (em oposição ao exemplo de código)? Leva-se a reestruturação do código existente para tirar proveito? Há um número significativo de casos em qualquer código de produção que podem ser vetorizado desta maneira?

Foi útil?

Solução

Ainda estou para ver qualquer GCC ou Intel C ++ vetorizar automaticamente qualquer coisa, mas muito simples loops, mesmo quando dado o código de algoritmos que podem (e eram, depois de eu reescrevi-los manualmente usando intrínsecos SSE) ser vetorizado.

Parte deste é ser conservador - especialmente quando confrontado com a possibilidade de aliasing ponteiro, ele pode ser muito difícil para um C / C ++ compilador para 'provar' a si mesmo que uma vetorização seria seguro, mesmo se você como o programador saber que isto é. A maioria dos compiladores (sensivelmente) preferem código não otimizar em vez de arriscar miscompiling-lo. Esta é uma área onde linguagens de alto nível têm uma vantagem real sobre C, pelo menos em teoria (digo, em teoria, já que eu não estou realmente ciente de quaisquer vectorizing automaticamente compiladores ML ou Haskell).

Outra parte é limitações simplesmente analíticas - a maioria das pesquisas em vetorização, eu entendo, está relacionada com a otimização de problemas clássicos numéricos (dinâmica de fluidos, por exemplo), que foi o pão e manteiga da maioria das máquinas de vetores antes há alguns anos (quando , entre CUDA / OpenCL, Altivec / SSE, eo celular STI, programação vector em várias formas tornou-se amplamente disponível em sistemas comerciais).

É bastante improvável que o código escrito para um processador escalar em mente vai ser fácil para um compilador para vectorize. Felizmente, muitas coisas que você pode fazer para tornar mais fácil para um compilador para entender como vetorizar ele, como azulejos loop e desdobramento de loop parcial, também (tendem a) desempenho ajuda em processadores modernos, mesmo se o compilador não descobrir como vetorizar-lo.

Outras dicas

É difícil de usar em qualquer lógica de negócios, mas dá velocidade ups quando você está processando volumes de dados da mesma forma.

bom exemplo é o processamento de som / vídeo onde aplicar a mesma operação para cada amostra / pixel. Eu tenho usado VisualDSP para isso, e você tinha que verificar os resultados depois de compilar -. Se ele é realmente usado onde deveria

Vectorization será útil principalmente para os programas numéricos. programas vectorized pode correr mais rápido em processadores vetoriais, como o processador Cell STI usado em consoles PS3 jogo. Lá, os cálculos numéricos utilizados em, por exemplo, tornando os gráficos do jogo pode ser acelerado um monte de vetorização. Esses processadores são chamados de SIMD (Single Instruction Multiple Data) processadores.

Por outro processadores vetorização não será usado. programas vectorized executado em um conjunto de instruções vectorized que costuma ser aplicável a um processador não-SIMD.

série da Intel Nehalem de processadores (lançado no final 2008) implementar SSE 4.2 instruções, que são instruções SIMD. Fonte:. wikipedia

instruções Vectorized não estão limitados a processadores Cell - estações de trabalho como mais modernos CPU tê-los (PPC, x86 desde pentium 3, Sparc, etc ...). Quando bem utilizada para operações de pontos flutuantes, pode ajudar bastante para muito de computação tarefas intensivas (filtros, etc ...). Na minha experiência, vetorização automática não funciona tão bem.

Você deve ter notado que praticamente ninguém realmente sabe como fazer bom uso de vetorização automática do GCC. Se você pesquisar em torno da web para ver os comentários das pessoas, que sempre vêm à ideia de que GCC permite ativar vetorização automática, mas muito raramente faz uso real dele, e por isso, se você quiser usar a aceleração SIMD (por exemplo: MMX, SSE, AVX, néon, AltiVec), então você basicamente haveto descobrir como escrevê-lo usando intrínsecos compilador ou código de linguagem Assembly.

Mas o problema com intrínsecos é que você efetivamente precisa entender lado linguagem da Assembléia dele e depois também aprender o método Intrinsics de descrever o que você quer, o que é susceptível de resultar em muito menos eficiente código do que se escreveu em código de montagem (como por um fator de 10x), porque o compilador ainda vai ter problemas para fazer bom uso de suas instruções intrínsecas!

Por exemplo, você pode estar usando SIMD Intrinsics de modo que muitas operações podem ser executadas em paralelo, ao mesmo tempo, mas o seu compilador provavelmente irá gerar o código Assembly que transfere os dados entre os registradores SIMD e os registros de CPU normais e nas costas, efetivamente tornando seu código run SIMD a uma velocidade semelhante (ou mesmo mais lenta) do que o código normal!

Então, basicamente:

  • Se você quiser até 100% speedups (2x velocidade), então quer comprar o Intel / compiladores oficiais braço ou converter alguns de seu código para usar SIMD C / C ++ Intrinsics.
  • Se você quer 1,000% aumentos de velocidade (velocidade de 10x), seguida escrevê-lo em código Assembly usando instruções SIMD com a mão. Ou se disponível no seu hardware, aceleração GPU uso ao invés, como OpenCL ou da Nvidia CUDA SDK, já que eles podem fornecer speedups semelhantes na GPU como SIMD faz na CPU.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top