Os riscos de dados em um processador de tubulação ocorrem quando existe uma dependência de dados entre as instruções, o que significa que uma instrução precisa do resultado de uma instrução anterior antes que esse resultado esteja disponível. Isso pode impedir o pipeline, reduzindo a eficiência. Várias técnicas atenuam esses perigos:
1. Encaminhamento de dados (desvio): * Mecanismo
: Este é o método mais comum e eficiente. Se o resultado de uma instrução em um estágio posterior do pipeline for necessário por uma instrução em um estágio anterior, o resultado será encaminhado diretamente do estágio posterior para o estágio anterior, ignorando o acesso à memória.
*
Exemplo: Digamos que a instrução i1 grava para registrar R1 e a instrução i2 lê a partir de R1. O encaminhamento de dados enviaria o valor escrito por I1 diretamente para I2, impedindo uma barraca, mesmo que I1 não tenha concluído sua gravação na memória.
*
Eficácia: Altamente eficaz para resolver os riscos Raw (leia após gravar), onde a dependência está entre as instruções escrevendo e depois lendo o mesmo registro.
2. Estagnando (inserção de bolhas): * Mecanismo
: Se o encaminhamento de dados não for possível (por exemplo, a dependência está muito distante no pipeline ou envolve acesso à memória), o pipeline é paralisado pela inserção de "bolhas"-instruções sem op-até que os dados estejam prontos.
*
Exemplo: I1 grava na memória e o i2 lê a partir desse local de memória. O encaminhamento de dados não é viável, pois a gravação de i1 deve ser concluída antes que o i2 possa ler. O oleoduto para até que o i1 complete sua gravação.
*
Eficácia: Mais simples de implementar do que o encaminhamento, mas reduz significativamente a taxa de transferência do pipeline.
3. Registre renomeação: * Mecanismo
: O compilador ou hardware atribui diferentes registros a instruções que podem ter uma dependência de dados. Isso elimina os perigos da guerra (escreva após a leitura) e WAW (escreva após escrever). Por exemplo, se duas instruções usarem o mesmo registro, o hardware poderá renomear um deles para um registro diferente, resolvendo o conflito.
*
Exemplo: Duas instruções querem escrever para R1. O registro renomeação atribui a segunda instrução a um registro temporário diferente, resolvendo o perigo WAW.
*
Eficácia: Altamente eficaz na eliminação de riscos de guerra e waw, mas envolve a complexidade do hardware. Frequentemente usado em conjunto com o encaminhamento de dados.
4. Otimizações do compilador: * Mecanismo
: Os compiladores podem analisar o código para dependências de dados e reordenar instruções para minimizar os perigos. Isso pode envolver o agendamento de instruções para separar as instruções que dependem uma da outra, reduzindo assim a necessidade de paralisação ou encaminhamento.
*
Exemplo: O compilador pode reordenar as instruções para mover as instruções que leem os dados mais longe das instruções que escrevem esses dados, dando assim ao pipeline mais tempo para terminar antes que a instrução dependente precise dele.
*
Eficácia: Reduz a frequência de perigos no nível do código -fonte, mas a eficácia depende dos recursos do compilador.
A escolha da técnica de mitigação depende da arquitetura específica do processador. Os processadores modernos geralmente usam uma combinação de encaminhamento de dados, renomeação de registro e otimizações do compilador para manipulação eficiente de riscos de dados. A estagnação é frequentemente usada como último recurso quando outras técnicas são insuficientes.