Que tipo de previsão de ramificação é mais importante?

11

Eu observei que existem dois tipos diferentes de estados na previsão de ramificações.

  1. Na execução superescalar, em que a previsão de ramificação é muito importante e ocorre principalmente no atraso da execução, em vez do atraso da busca.

  2. No pipeline de instruções, onde a busca é mais problemática, pois as instruções não são executadas até mais tarde.

Qual deles é muito importante (como qual deles realmente importa na CPU hoje em dia)? Se ambos são igualmente importantes ou, no caso de o segundo ser mais importante, por que não temos dois canais de instrução (provavelmente com metade do comprimento) e, dependendo dos ramos, basta escolher um deles e iniciar novamente a população a partir do começando?

Kaveh
fonte
1
Talvez os dois sejam importantes, dependendo das circunstâncias?
Raphael

Respostas:

6

Não sei qual caso prevalece, mas gostaria de oferecer algumas idéias sobre a sua proposta de dutos duplos.

Antes de tudo, você precisaria dobrar o fio, o que consumiria o dobro da energia e produziria o dobro do calor enquanto ativo. Embora não seja necessário, por outro lado, seria completamente inútil. Portanto, alguém poderia argumentar que não é um bom uso de recursos que são raros nos processadores modernos.

Mais fundamentalmente, a menos que você prefira um ramo com base na probabilidade, como você sabe em qual versão escrever? Se nenhum, você pode não salvar nada, porque outros processadores podem ter que aguardar sua decisão, de qualquer maneira. Se você se ater a um deles, terá essencialmente a mesma probabilidade e custo de reversão que possui agora.

C=c+p(cr+c)cpcr2c2c+pcrCpcrpt+p(tr+t)tt+ptrp

Rafael
fonte
Até onde eu sei, a Intel tentou as "instruções de leitura para os dois lados do ramo" e até "executou as instruções para os dois lados do ramo" e parou de fazer isso. Ou porque não ganhou nada, ou porque o custo e a complexidade eram tão altos que eles poderiam obter mais ganhos de maneiras diferentes pelo mesmo custo.
gnasher729
@ gnasher729 E isso foi provavelmente antes de aprendermos sobre falhas de segurança associadas a recursos como este?
Raphael
2

Em certo sentido, o efeito da previsão de ramificação é mais crítico na busca de instruções, pois uma instrução que não é buscada não pode ser executada.

No que diz respeito à execução dos dois caminhos de uma ramificação, isso é chamado de execução ansiosa e foi pesquisado de maneira substancial. Augustus K. Uht e Vijay Sindagi, "Disjoint Eager Execution: Uma Forma Ótima de Execução Especulativa" (1995), pode valer a pena dar uma olhada.

A execução ansiosa tem vários problemas. Para especulações profundas, o número de caminhos que devem ser rastreados pode crescer exponencialmente (cada caminho de ramificação bifurcada pode encontrar uma ramificação). A previsão de ramificação também costuma ser muito precisa (> 90% correta), portanto, sempre a execução dos dois caminhos seria um desperdício. A execução ansiosa também pode "contaminar" os caches com conteúdo inútil. (O documento acima mencionado propôs inteligentemente uma execução ávida e limitada para evitar alguns desses problemas.) A busca limitada pelo caminho alternativo tem menos problemas e pode ser um pouco atraente na redução do atraso na recuperação de erros de previsão em pipelines mais curtos.

Outra abordagem proposta é predicar dinamicamente ramificações "hammock" (ramificações curtas para a frente que se juntam de volta ao caminho principal do fluxo de instruções). Artur Klauser et al., "Previsão de rede dinâmica para arquiteturas de conjunto de instruções não predicadas" (1998) podem valer uma leitura para essa idéia. (Hyesoon Kim et al., "Wish Branch: combinando ramificação condicional e predição para execução predicativa adaptativa" propõe adicionar a um ISA ramificações que facilitam a predicação de redes e estende esse método de predicação a ramificações de loop difíceis de prever.

Paul A. Clayton
fonte
Essa é uma resposta muito boa! Obrigado. :-)