Alguns toques genéricos em uma resposta:
-
Você coloca o dedo diretamente nele - os registros XMM fazem uso de operações vetoriais, por exemplo, SSE em várias versões, AVX etc. É possível usar operações vetoriais para fazer um processamento MUITO sofisticado. Pixels em uma imagem, por exemplo, geralmente contêm vários canais de cores relacionados (vermelho, verde, azul e alfa, por exemplo). Operações vetoriais em pixels podem gerar enormes aumentos no desempenho. Considerando que os processadores estão se tornando mais paralelos hoje em dia do que recebendo velocidades de clock maiores (processador Xeon de 22 núcleos, qualquer um?), Fazer mais operações intensivas de CPU com mais dados em paralelo é uma Coisa Boa. Ele facilita a obtenção de mais núcleos em execução em um trabalho ao mesmo tempo, considerando a largura de banda de memória limitada.
-
Se você não tem apenas pequenas funções modulares (e todos nós temos que enfrentar grandes e complexos fluxos lógicos às vezes), mais registros podem ser melhores para eficiência. Idealmente, os trechos de código mais strongmente executados devem ser feitos com acesso mínimo à memória RAM, de modo que poder colocar todas as variáveis importantes nos registros é uma coisa boa.
Observe que as operações vetoriais não são apenas para ponto flutuante; Existem muitas operações inteiras onde instruções SSE podem ser benéficas. É possível, por exemplo, codificar movimentos de memória altamente eficientes, buscando linhas de cache cheias de dados por meio de instruções de 128 bits com processadores construídos nos últimos 15 anos (isto é, suportando apenas SSE2).
Por último, mas não menos importante, como negativo, o processo de entrada e saída de dados dos registradores XMM pode ser um pouco desafiador. A menos que você tenha planejado o design do sistema com cuidado, alternar entre usar registros "do jeito antigo" sem vetores e usar vetores pode ser ineficiente.
No entanto, quando você começa a pensar sobre o que as operações de vetores podem fazer por você, novos horizontes bem legais se abrem. Imagine um objeto loop, por exemplo, que facilita a multiplicação de loops forçados aninhados com, por exemplo, coordenadas X e Y mantidas em um único vetor. Apenas uma instrução PADDD (_mm_add_epi32) pode incrementar uma variável de loop externo E redefinir uma variável de loop interno para se preparar para o próximo conjunto de iterações.
Uma referência útil: