Pergunta

eu estou trabalhando no Visual Studio 2008 e em configurações do projeto eu vejo a opção "ativar Alargado conjunto de Instruções" que eu possa definido como Nenhum, SSE ou SSE2

Assim, o compilador irá tentar lote instruções juntos, a fim de fazer uso de instruções SIMD?

Há regras pode-siga em como otimizar o código que o compilador pode fazer effiecient assembler usando essas extensões?

Por exemplo, atualmente eu estou trabalhando em um raytracer.Um shader leva alguns entrada e calcula a partir da entrada de uma saída de cor, como este:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);

seria, por exemplo, ser benéfico para escrever o shadercode que sombra 4 tipos diferentes de pixels dentro de uma instrução de chamada?algo como isto:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);

para processar vários dataunits de uma só vez.Isso seria benéfico para fazer o compilador usar SSE instruções?

obrigado!

Foi útil?

Solução

eu estou trabalhando no Visual Studio 2008 e em configurações do projeto eu vejo a opção "ativar Alargado conjunto de Instruções" que eu possa definido como Nenhum, SSE ou SSE2

Assim, o compilador irá tentar lote instruções juntos, a fim de fazer uso de instruções SIMD?

Não, o compilador não irá usar o vetor de instruções sobre o seu próprio.Ele vai usar escalar de instruções SSE, em vez de 87 x queridos.

O que você descreve é chamado de "vetorização automática".Compiladores Microsoft não fizer isso, Intel compiladores fazer.

No compilador Microsoft que você pode usar intrínsecos para executar manual SSE otimizações.

Outras dicas

Três observações.

  1. As melhores acelerações não vêm de otimizações, mas de Bons algoritmos. Portanto, certifique -se de acertar essa parte. Muitas vezes, isso significa apenas usar as bibliotecas corretas para o seu domínio específico.

  2. Depois de acertar seus algoritmos, é hora de A medida. Muitas vezes, há uma regra 80/20 no trabalho. 20% do seu código levará 80% do tempo de execução. Mas para localizar essa parte, você precisa de um bom perfil. Intel vtune Pode fornecer perfil de amostragem de todas as funções e bons relatórios que identificam os assassinos de desempenho. Outra alternativa gratuita é AMD codeanalyst Se você tem uma CPU AMD.

  3. A capacidade de autoveitorização do compilador não é uma bala de prata. Embora isso se esforce muito (especialmente Intel C ++) Você geralmente precisará ajudá -lo, reescrevendo os algoritmos em forma de vetor. Muitas vezes, você pode obter resultados muito melhores ao manusear pequenas partes do código de gargalo para usar as instruções SIMD. Você pode fazer isso no código C (consulte o link do VJO acima) usando o Intrinsics ou use a montagem embutida.

Obviamente, as partes 2 e 3 formam um processo iterativo. Se você é realmente sério sobre isso, existem alguns bons livros sobre o assunto por pessoas da Intel, como O livro de receitas de otimização de software e os manuais de referência do processador.

O compilador não é todo poderoso, e ele tem algumas limitações.Se pode (e se a direita sinalizadores são passados para ele), ele vai usar instruções SSE.A única maneira de ver o que ele fez é examinar o código assembly gerado pelo compilador.

Outra opção é usar C SSE/SSE2 instruções.Para windows, você pode encontrá-los aqui:

http://msdn.microsoft.com/en-us/library/y0dh78ez%28VS.80%29.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top