Revisão final da arquitetura de computadores

Revisão final da arquitetura de computadores

Capítulo 1 Fundamentos de Design e Análise Quantitativa

| 1.2.6 Grau de Paralelismo e Classificação de Arquiteturas Paralelas

Existem dois tipos principais de paralelismo em aplicativos:

  • Paralelismo em nível de dados: paralelismo alcançado pela operação de muitos itens de dados simultaneamente
  • Paralelismo em nível de tarefa: crie tarefas de trabalho que podem ser processadas individualmente e executadas massivamente em paralelo

Todos os computadores podem ser divididos em: com base no paralelismo do fluxo de instruções e do fluxo de dados:

  • SISD (Single Instruction Stream Single Data): Processador único, mas pode aproveitar o paralelismo em nível de instrução
  • SIMD (Single Instruction Stream Multiple Data Stream): A mesma instrução é executada por vários processadores usando diferentes fluxos de dados, que podem desenvolver paralelismo em nível de dados
  • MISD (Multiple Instruction Stream Single Data Stream): não existe temporariamente
  • MIMD (múltiplos fluxos de instruções, múltiplos fluxos de dados): cada processador extrai suas próprias instruções e opera com seus próprios dados, visando o paralelismo em nível de tarefa.

| 1.3 Arquitetura de Computadores

Consulte o Apêndice A

| 1.4.1 Largura de banda supera latência

A velocidade de melhoria da largura de banda é muito maior do que a velocidade de melhoria da latência

| 1.9 Princípios quantitativos de design de computador

Três princípios básicos de design de computador:

  • Aproveite o paralelismo
  • princípio da localidade
  • Concentre-se em situações comuns: a lei de Amdahl

Taxa de aceleração = tempo de execução original usando tempo de execução melhorado Taxa de aceleração = \frac{Tempo de execução original}{Usando tempo de execução melhorado}Taxa de aceleração=Use tempo de execução aprimoradoTempo de execução original

Novo tempo de execução = tempo de execução original × [ ( 1 − taxa de atualização) + taxa de atualização, taxa de aceleração de atualização] Novo tempo de execução = tempo de execução original \times [(proporção de 1 atualização) +\frac{proporção de atualização}{taxa de aceleração de atualização } ]novo tempo de execução=Tempo de execução original×[( 1-Taxa de atualização )+Taxa de aceleração de atualizaçãoProporção de atualização]

Taxa de aceleração total = tempo de execução original novo tempo de execução = 1 ( 1 − taxa de atualização) + taxa de atualização taxa de aceleração de atualização taxa de aceleração total = \frac{tempo de execução original}{novo tempo de execução}=\frac{1}{(1- Proporção de atualização)+\frac{Proporção de atualização}{Taxa de aceleração de atualização}}Aceleração geral=novo tempo de execuçãoTempo de execução original=( 1-Taxa de atualização )+Taxa de aceleração de atualizaçãoProporção de atualização1

Capítulo 3 Paralelismo de nível de instrução

| 3.1 Paralelismo em nível de instrução

Processadores modernos implementam paralelismo de nível de instrução (ILP) por meio de pipelines para melhorar o desempenho. O CPI de um processador em pipeline é:
CPI do pipeline = CPI do pipeline ideal + Pausa de risco estruturado + Pausa de risco de dados + Pausa de risco de controle CPI do pipeline = CPI de pipeline ideal + Pausa de risco estruturado + Pausa de risco de dados + Pausa de risco de controlePipeline CP I=Pipeline ideal CP I+Pausa de aventura estruturada+Pausa na aventura de dados+Controlando pausas arriscadas
A unidade de pausas é por instrução. As principais tecnologias ILP são:

tecnologia Qual parte do IPC deve ser reduzida? Baseado em hardware/software
Avançar Pausa na aventura de dados hardware
Programação dinâmica básica (placar) Pausa na aventura de dados hardware
Agendamento dinâmico com renomeação (Tomaluso) Pausa na aventura de dados hardware
Ramificação atrasada e previsão básica de ramificação Controlando as pausas da aventura hardware
previsão dinâmica de ramificação Controlando as pausas da aventura hardware
desenrolamento do laço Controlando as pausas da aventura Programas
Agendamento de pipeline do compilador Pausa na aventura de dados Programas

O risco mais comum no pipeline é o risco de dados. O risco de dados é causado por dependências (dependências). Existem três tipos de dependências:

  • O operando da instrução atual é o resultado da instrução anterior, o que é uma verdadeira dependência de dados e pode levar a riscos de leitura após gravação (RAW).
  • O resultado da instrução atual é gravado no operando da instrução anterior, o que é anti-dependente e pode levar a um risco de gravação após leitura (WAR).
  • A instrução atual e a instrução anterior gravam no mesmo local e a saída é dependente, o que pode levar a riscos de gravação após gravação (WAW).

Correlação é apenas a relação entre instruções e não necessariamente causa riscos no pipeline . Depende da estrutura específica de implementação do pipeline.

| 3.2 Expansão de loop

O desenrolamento de loop é uma tecnologia que melhora o paralelismo em nível de instrução.Ao usar o desenrolamento de loop, as seguintes decisões e transformações devem ser tomadas:

  • Certifique-se de que os loops de iteração não sejam relevantes, portanto, o desenrolar do loop é útil
  • Use registros diferentes para evitar restrições causadas pelo uso do mesmo registro para operações diferentes (usando múltiplas variáveis)
  • Remova testes redundantes e instruções de ramificação
  • Observe se as instruções de carregamento e armazenamento de diferentes iterações não estão relacionadas e não fazem referência ao mesmo endereço antes de agendar a posição de troca.
  • Código de agendamento

| Exemplo de expansão de loop

Considere o seguinte trecho de código:

for(i=999;i>=0;i--){
    x[i] = x[i] + s;
}

A instrução RISC-V de 64 bits correspondente é a seguinte, assumindo que x[i] e s são ambos números de ponto flutuante:

Loop:
	fld f0,0(x1)	 #x1是x[999]的地址
	fadd.d f4,f0,f2  #f2存储s
	fsd f4,0(x1)
	addi x1,x1,-8	 #双精度浮点数数组,i--相当于地址-8
	bne x1,x2,Loop

Para o pipeline RISC-V, suponha que a latência da operação de ponto flutuante seja a seguinte e a latência da operação inteira seja 0:

Insira a descrição da imagem aqui

Então você pode obter a sequência de execução do pipeline:

Loop:	fld	f0,0(x1)
		stall
		fadd.d f4,f0,f2
		stall
		stall
		fsd f4,0(x1)
		addi x1,x1,-8
		bne x1,x2,Loop

A conclusão da sequência de instruções acima requer 8 ciclos, e uma pausa pode ser reduzida através do agendamento:

Loop:	fld	f0,0(x1)
		addi x1,x1,-8
		fadd.d f4,f0,f2
		stall
		stall
		fsd f4,0(x1) 		
		bne x1,x2,Loop

Por causa desse código, as iterações são irrelevantes. Desenrole esse loop quatro vezes. As três primeiras instruções de salto de ramificação podem ser excluídas. i– pode ser transformado em i=i-4. Tente usar registros diferentes para evitar restrições. , o novo sequência de instruções é:

Loop:	fld	f0,0(x1)
		fadd.d f4,f0,f2
		fsd f4,0(x1)
		
		fld	f6,-8(x1)
		fadd.d f8,f6,f2
		fsd f8,0(x1)
		
		fld	f10,-16(x1)
		fadd.d f12,f10,f2
		fsd f12,-16(x1)
		
		fld	f14,-24(x1)
		fadd.d f16,f14,f2
		fsd f16,-24(x1)
		
		addi x1,x1,-32
		bne x1,x2,Loop

Haverá uma pausa entre o carregamento e a operação, e também haverá uma pausa entre a operação e o armazenamento. Portanto, esta sequência de instruções precisa ser agendada. Como são usados ​​​​registros diferentes, haverá uma pausa entre o carregamento e o carregamento, e entre operação e operação. Não haverá pausas, então programe tudo junto:

Loop:	fld	f0,0(x1)
		fld	f6,-8(x1)
		fld	f10,-16(x1)
		fld	f14,-24(x1)
		
		fadd.d f4,f0,f2
		fadd.d f8,f6,f2
		fadd.d f12,f10,f2
		fadd.d f16,f14,f2
		
		fsd f4,0(x1)
		fsd f8,0(x1)
		fsd f12,-16(x1)
		fsd f16,-24(x1)

		addi x1,x1,-32
		bne x1,x2,Loop	

Agora não haverá pausa em toda a sequência, e o cálculo desses quatro loops pode ser concluído em 14 ciclos, com uma média de 3,5 ciclos por loop, o que é obviamente mais rápido do que não usar a expansão do loop.

| 3.4-3.5 Agendamento Dinâmico e Algoritmo Tomasulo

O agendamento dinâmico é mais flexível, permitindo que as instruções sejam executadas em ordens diferentes e reduzindo paradas. Reorganizar a execução de instruções por hardware permite a execução eficiente de código em diferentes pipelines e pode lidar com dependências (envolvendo referências de memória) que não são conhecidas em tempo de compilação, bem como falhas de cache.

O algoritmo de placar apresentado no Apêndice C é um algoritmo de escalonamento dinâmico que permite que instruções sejam executadas fora de ordem. O painel de avaliação verificará vários riscos de dados e estruturará os riscos separadamente em cada etapa da instrução e evitará riscos por meio de pausas.

O algoritmo Tomasulo usa uma ideia semelhante ao algoritmo de placar para registrar o status de execução das instruções e verificar riscos. A diferença é que Tomasulo usa a renomeação de registros para eliminar duas dependências de dados falsas, WAR e WAW, e elimina os dois riscos de dados correspondentes. Além disso, no algoritmo Tomasulo, uma unidade funcional possui múltiplos buffers, e instruções que utilizam a mesma unidade funcional podem aguardar na estação de reserva quando a unidade funcional estiver ocupada, reduzindo pausas causadas por riscos estruturais.

Estrutura de implementação do algoritmo Tomasulo

A estrutura de implementação do algoritmo Tomasolu é a seguinte:

Insira a descrição da imagem aqui

  • FP OP Queue: Fila de instruções, as instruções são emitidas a partir daqui
  • Estações de reserva: Estações de reserva, que retêm informações de comando transmitidas e dados armazenados em buffer
  • Unidade de Endereço: Unidade de cálculo de endereço. O endereço de armazenamento será calculado antes da execução da instrução de armazenamento.
  • Unidade de memória: unidade de armazenamento
  • CDB: Barramento de transmissão de dados, que vai diretamente ao arquivo de registro e à estação de reserva para transmitir os dados.

Estação reservada, tabela de status de resultado de registro, tabela de status de instrução

No algoritmo Tomasulo, a execução das instruções possui três etapas: lançamento, execução e write back. A tabela de status do comando é a seguinte:

Insira a descrição da imagem aqui

  • Emissão de instrução: o algoritmo Tomasulo emite instruções sequencialmente, a condição para julgar se pode ser emitida é que haja espaço livre na estação de reserva do caminho correspondente da instrução . Uma vez emitida a instrução, ela ocupará o registro na estação de reservas e atualizará a estação de reservas e registrará a tabela de status dos resultados. Durante a transmissão, os dados que podem ser lidos serão lidos para a estação de reserva. Ao atualizar a tabela de status de resultados do registro, as informações de gravação mais recentes das instruções subsequentes são sempre retidas na tabela e as instruções subsequentes são gravadas no registro de destino. Os resultados das instruções anteriores não são gravados. Instruções que exigem o valor de as instruções anteriores podem ser obtidas diretamente ouvindo CDB.
  • Execução: Após os dados de origem estarem prontos, a execução é iniciada e a unidade funcional do dispositivo de execução é ocupada.
  • Write back: Passe os dados diretamente para o arquivo de registro e para cada estação de reserva através do barramento CDB, atualize o arquivo de registro de acordo com a tabela de status de resultado de registro e limpe as informações da estação de reserva e da tabela de status de resultado de registro.

No placar, cada caminho de configuração pode armazenar apenas uma instrução. O algoritmo Tomasulo configura um conjunto de buffers para cada caminho . Para a mesma unidade de computação, várias instruções podem ser armazenadas em buffer. Quando a unidade de computação está ocupada, as instruções subsequentes podem ser Estação de reserva espera. A estação de reserva pode registrar diretamente os dados que podem ser lidos na estação de reserva e, para dados não prontos, os dados de transmissão serão capturados assim que o cálculo for concluído, e a fonte de dados será marcada com o número da estação de reserva em vez do número do registro, realizando assim a relocação do registro .

Insira a descrição da imagem aqui

Figura 2: Estação de Reservas

Assim como o placar, o algoritmo Tomasulo também registra o status do resultado do cadastro e registra a fonte de dados da atualização do cadastro. A fonte de dados seleciona os dados de instrução mais recentes .

Desvantagens do algoritmo de Tomasulo

  • Complexo de implementar
  • Requer CDB de alta velocidade
  • Desempenho limitado pelo CDB

| Preenchimento de formulário com algoritmo Tomasulo

Ao preencher o formulário com o algoritmo Tomasulo, deve-se atentar para o preenchimento direto dos operandos com valores que possam ser lidos. E se a operação do ciclo atual estiver sendo escrita de volta, se a instrução emitida no ciclo atual exigir operação, a operação será lida diretamente na estação de reserva, em vez de ter que ser lida no próximo ciclo como o placar. Após o write-back (a tabela no tempo de ciclo durante o write-back), a tabela de status dos resultados do registro também deve registrar o valor correspondente. Semelhante ao placar, durante o ciclo de write-back da instrução, as informações da estação reserva sobre esta instrução podem ser apagadas no momento do preenchimento do formulário.

Capítulo 5 Paralelismo em nível de thread

| 5.4 Protocolo de Consistência de Diretório e Protocolo de Consistência de Monitoramento

Processadores multicore podem ter níveis de cache compartilhados e dedicados. Se vários processadores compartilharem dados na memória, eles poderão armazenar os dados compartilhados em seus próprios caches dedicados. Processadores diferentes podem armazenar valores diferentes dos mesmos dados em seus próprios caches. Este é um problema de consistência de cache.

A maneira de garantir a consistência do cache é usar um protocolo de consistência.Existem dois protocolos de consistência:

  • Diretório: mantém o estado compartilhado dos blocos de memória física em um local chamado diretório
  • Escuta: Se um cache tiver uma cópia de um bloco de memória física, o estado compartilhado desse bloco será rastreado. Todos os caches são acessíveis através de algum meio de transmissão e todos os controladores de cache escutam esse meio.

Ambos os protocolos são protocolos de invalidação de gravação, onde o processador invalida outras cópias enquanto executa uma operação de gravação.

Os protocolos de coerência Snoop são normalmente implementados com um controlador de estado finito que altera o estado dos blocos de cache selecionados e acessa ou invalida dados usando o barramento. Ao enviar um sinal para o barramento, o bloco das outras CPUs é invalidado, e ao enviar um sinal, as outras CPUs são informadas de que ocorreu uma perda de leitura ou gravação.

No protocolo de consistência de diretório, cada processador possui um diretório que armazena o status de cada bloco armazenável em cache.As informações incluem quais caches possuem cópias deste bloco, se ele precisa ser atualizado, etc. Cada bloco de memória possui uma entrada correspondente no diretório. Cada entrada do diretório consiste em um status de acesso e um vetor de bits. O vetor de bits registra se cada processador possui uma cópia do bloco. O protocolo de consistência de diretório não notifica outros processadores sobre uma falha de bloco por meio de transmissão, mas notifica a CPU correspondente de que o bloco falhou ou concluiu o trabalho de atualização do bloco com base no vetor de bits. E a CPU que pertence à memória onde o bloco está localizado serve como host para se comunicar com o processador que precisa se comunicar, e completa a notificação de falha de gravação e as operações de write-back.

Comparação de dois métodos

O método de escuta é baseado no barramento e implementa falhas de gravação por meio da transmissão de sinais. A vantagem é que não requer espaço de armazenamento adicional para manter a consistência das informações. A desvantagem é a baixa escalabilidade. Quanto maior o número de processadores, maior a pressão sobre comunicação de ônibus.

O método de diretório usa um diretório centralizado para manter informações de consistência, o que aumenta a sobrecarga de armazenamento. No entanto, as informações de consistência são armazenadas no diretório de maneira centralizada e a própria estrutura do diretório é distribuída, portanto é escalonável. A maior vantagem do método de diretório é que ele pode ser implementado em um sistema distribuído, não requer barramento e é escalável.

Apêndice A

| A.2 Classificação da arquitetura do conjunto de instruções

De acordo com a classificação do tipo de armazenamento, existem três tipos de arquiteturas de conjunto de instruções:

  • arquitetura de pilha
  • arquitetura do acumulador
  • Arquitetura de registro de uso geral: operandos são registros ou locais de memória
    • Arquitetura de memória de registro: O operando pode ser um endereço de memória e o tamanho do programa é pequeno, mas a complexidade da instrução será diferente e os ciclos de clock necessários para conclusão serão diferentes.
    • Arquitetura de armazenamento de carga (arquitetura registro-registro): Somente instruções de armazenamento de carga podem acessar a memória. O número de clocks necessários para a execução das instruções é semelhante, o que facilita o pipeline de instruções, mas o tamanho do programa é grande.

| A.3-A.6 Características da arquitetura do conjunto de instruções

  • Explique o endereço e o modo de endereçamento: Os endereços podem ser expressos de duas maneiras: big-endian e little-endian. O endereçamento dos dados geralmente é alinhado. Os métodos de endereçamento incluem endereçamento de registro, endereçamento imediato, endereçamento de deslocamento, endereçamento direto, etc. Uma arquitetura deve suportar pelo menos o endereçamento indireto de registro mais comumente usado, o endereçamento de deslocamento e o endereçamento imediato.
  • Tipo e tamanho do operando
  • Operações no conjunto de instruções: geralmente suportam pelo menos operações aritméticas e lógicas, operações de transferência de dados, operações de controle e operações do sistema
  • Instruções de fluxo de controle: desvio condicional, salto, chamada de procedimento, retorno de procedimento
  • Codificação do conjunto de instruções: permite tantos registros e modos de endereçamento quanto possível e controla o comprimento da instrução, esperando que as instruções possam ser facilmente processadas pelo pipeline
    • Codificação de comprimento variável: permite todos os modos para todas as operações. O tamanho do código é mais importante que o desempenho
    • Codificação de comprimento fixo: O efeito é melhor quando o modo de endereçamento e os operandos são pequenos e a operação e o modo de endereçamento são mesclados no opcode. O desempenho é mais importante que o tamanho do código
    • codificação mista

| Arquitetura RISC-V

Tomando RISC-V64G como exemplo, apresentaremos as características acima desta arquitetura de conjunto de instruções.

  • Registros: o RV64G possui 32 registros de uso geral de 64 bits, 32 registros de ponto flutuante de 64 bits e alguns registros de uso especial.

  • Operandos: RV64G suporta byte, meia palavra, palavra, palavra dupla e ponto flutuante de precisão simples/dupla.

  • Modo de endereçamento: Os únicos modos de endereçamento de dados são endereçamento imediato e endereçamento offset. Quando o deslocamento é 0, o endereçamento indireto do registrador é implementado. RV64G usa endereços de 64 bits e armazenamento little-endian. Os acessos à memória não precisam estar alinhados, mas o uso de acessos à memória não alinhados será muito lento.

  • Codificação do conjunto de instruções: codificação de comprimento fixo. O formato de montagem correspondente é OP rd rs1 rs2.

Insira a descrição da imagem aqui

  • Operações: armazenamento de carga, operações ALU, ramificações e saltos, operações de ponto flutuante.
  • Instruções de fluxo de controle: instruções de ramificação e salto.

Apêndice B

| B.2 Avaliar o desempenho do cache

desempenho do cache

O tempo de pausa na memória costuma ser usado para avaliar o desempenho do cache:

Ciclo de parada de memória = número de falhas x custo de falhas = IC (número de instruções) x acesso à memória/instrução x taxa de falhas x custo de falhas

Outra métrica é usar o tempo médio de acesso à memória:

Tempo médio de acesso à memória = tempo de acerto + taxa de erros x custo de erros

Ao calcular a taxa de aceleração trazida pelo cache, você pode calcular o CPI com e sem cache e, em seguida, obter a taxa de aceleração. A fórmula de execução do CPI considera apenas travamentos de memória e, sem cache, a taxa de falta é de 100%.

Quatro questões a serem consideradas ao armazenar em cache

  • Organização de cache: mapeamento totalmente associativo/associativo de grupo/direto
  • Pesquisa de cache: divida o endereço físico em TAG|INDEX|BLOCK OFFSET
  • Estratégia de substituição de cache: aleatório/LRU (geralmente apenas pseudo-LRU é implementado)/FIFO
  • Estratégias de alfabetização:
    • Gravação: gravação/writeback direto. O write-back é mais rápido, requer apenas gravações no cache e usa menos largura de banda de memória. A gravação direta é mais fácil de implementar e o próximo nível de armazenamento sempre possui uma cópia atualizada, simplificando a consistência dos dados.
    • Gravação ausente: Envio de gravação/Sem envio de gravação. O cache write-back geralmente usa despacho de gravação, na esperança de que as gravações subsequentes sejam capturadas pelo cache, enquanto o cache write-through geralmente usa despacho sem gravação.

| B.3 Avaliar o desempenho do cache

6 métodos básicos de otimização de cache:

  • Aumente o tamanho do bloco para reduzir as taxas de falhas: blocos maiores reduzem as falhas frias e aproveitam ao máximo a localidade espacial, mas os blocos muito grandes aumentam os custos das falhas e aumentam os outros dois tipos de falhas. A escolha do tamanho do bloco depende da largura de banda e da latência da memória de baixo nível. Para memórias de alta largura de banda e alta latência, o uso de blocos grandes raramente aumenta o custo de perda e é incentivado o uso de blocos grandes. processador é de baixa latência e baixa largura de banda, é recomendável usar blocos pequenos.
  • Aumente o cache para reduzir a taxa de faltas: pode reduzir as faltas de capacidade, mas a desvantagem é que pode estender o tempo de acerto e aumentar o custo e o consumo de energia.
  • Aumentar o grau de associação para reduzir a taxa de falta: A regra geral é que a associação de grupo de oito vias é tão eficaz quanto a associação completa. No entanto, aumentar o grau de correlação aumentará o custo faltante
  • Use o cache multinível para reduzir custos perdidos: O uso do cache multinível pode acelerar o cache e expandir a capacidade do cache. Para medir efetivamente a situação de falta do cache multinível, são utilizadas a taxa de falta local (a taxa de falta do nível de cache atual) e a taxa de falta global (a taxa de falta do cache geral). A velocidade do cache de primeiro nível afeta a frequência do clock do processador, e a velocidade do cache de segundo nível afeta apenas o custo de falta do cache de primeiro nível. O cache L2 possui maior taxa de miss, então o foco está na redução de misses, utilizando maior associatividade e blocos maiores
  • As falhas de leitura têm maior prioridade do que as falhas de gravação - reduzem o custo das falhas: Para problemas de leitura após gravação, se a gravação não foi concluída e o buffer ainda está sendo gravado, a falha de leitura pode primeiro verificar o conteúdo do buffer de gravação
  • Evite a conversão de endereços ao indexar o cache - Reduza o tempo de acerto: o sistema pode usar endereços virtuais no cache para reduzir o tempo de acerto. Para garantir a proteção do espaço de endereço e outros motivos, uma solução é usar uma parte do deslocamento da página para indexar o cache, enquanto a correspondência de sinalizadores ainda usa o endereço físico, para que a tradução do endereço possa ser realizada enquanto o índice é usado para ler o cache.

apêndice C

| C.1 Implementação básica de pipeline

Divida o processo de execução de instruções em 5 ciclos, inicie uma nova instrução em cada ciclo para realizar o pipeline de instruções e adote os seguintes pontos:

  • Use cache de instruções e cache de dados separados para evitar conflitos de acesso à memória.
  • Os registradores são escritos durante a primeira metade do ciclo de clock e lidos durante a segunda metade.
  • O contador do programa é incrementado e o endereço de destino da ramificação é calculado.
  • Registros de pipeline são introduzidos para transferir dados em estágios consecutivos de pipeline para garantir que os dados em todos os níveis não interfiram uns com os outros.

O pipeline pode melhorar o rendimento das instruções da CPU, mas não pode reduzir o tempo de execução de uma única instrução. Porque a velocidade do clock deve ser maior que o estágio mais lento do pipeline, e os registros do pipeline introduzem latência.

| C.2 Obstáculos à racionalização - Aventura na linha de montagem

A execução de instruções em pipeline é prejudicada principalmente pelos riscos do pipeline, incluindo os três riscos a seguir, e as soluções correspondentes são:

  • Assunção de riscos estruturais: Assunção de riscos causados ​​por conflitos de recursos.
    • pausa
    • Adicione hardware (é preciso avaliar se vale a pena)
    • Reordenação de instruções
  • Perigos de dados: Perigos de pipeline causados ​​pela dependência de dados.
    • Avançar
    • pausa
    • Reordenação de instruções
  • Risco de controle: risco causado por instruções de filial.
    • Mecanismo básico de previsão: previsão marcada/desmarcada, atraso de ramificação, previsão de ramificação estática
    • Predição dinâmica de ramificação: preditor de ramificação de 2 bits

| C.3 Implementação de Pipelining

O MIPS move o cálculo e a detecção de filiais para o estágio de identificação, na esperança de reduzir as pausas causadas por riscos de filiais.

Insira a descrição da imagem aqui

Se o cálculo do desvio for concluído no estágio ID, alguns riscos de dados causarão mais pausas. Portanto, o RISC-V foi projetado para concluir o julgamento do desvio no estágio EX . Dessa forma, se não houver previsão de desvio, duas instruções serão ser desperdiçado, o que equivale a duas pausas . RISC-V usa previsão dinâmica de ramificação e não usa slots de atraso, porque atrasos de ramificação nem sempre são viáveis, e o julgamento de ramificação é concluído na fase EX, os saltos são feitos com base nos resultados previstos na fase de ID e a verificação é realizada em a fase EX.

Insira a descrição da imagem aqui

| C.7 Placar de agendamento dinâmico básico

No pipeline de agendamento dinâmico, as instruções são emitidas em ordem e executadas fora de ordem, usando um placar . O placar é totalmente responsável pelo lançamento e execução do comando, incluindo todas as tarefas de detecção de aventura. A execução fora de ordem causará riscos WAR e WAW que não existem no pipeline de execução sequencial original.Esses riscos são detectados e processados ​​pelo placar. Cada instrução entrará no placar e haverá um registro. O placar determinará quando os operandos podem ser lidos e executados e também controlará quando a instrução poderá ser escrita de volta no registrador de destino. Cada componente funcional possui um caminho de dados (um local registrado) no placar.

Existem quatro etapas para instruções a serem concluídas no pipeline:

  • Problema: Se uma unidade funcional da instrução estiver livre e não houver outras instruções ativas direcionadas ao mesmo registro, a instrução é emitida para a unidade funcional. Se houver um perigo WAW ou estrutural, a emissão do comando será interrompida.
  • Operandos de leitura: O placar monitora a disponibilidade do operando de origem. Se nenhuma das instruções emitidas anteriormente gravou no operando de origem, o operando de origem está disponível. Esta etapa resolve o perigo RAW.
  • Execução: A unidade funcional inicia a execução após receber o operando, após o resultado estar pronto, notifica o placar que a execução foi concluída.
  • Gravar resultados: Quando o placar sabe que a unidade funcional concluiu a execução, ele verifica o risco de WAR e interrompe a conclusão das instruções, se necessário.

O placar tem três seções:

  • Status da instrução: indica em qual etapa das quatro etapas a instrução está
  • Status da unidade funcional: indica o status da unidade funcional, Fj e Fk são os números do registrador de origem, Fi é o registrador de destino, Qj, Qk são as unidades funcionais que geram o registrador de origem, Rj e Rk indicam se o operando está pronto
  • Status do resultado do registro: Indica qual unidade funcional irá escrever em qual registro. O campo ficará vazio após a conclusão da escrita.

| Formulário de preenchimento do placar

Ao preencher o formulário, durante a fase de leitura da instrução, Rj e Rk ainda estão no estado pronto para leitura e, após entrar na fase de execução, são configurados para leitura. Ao entrar na fase de writeback, a tabela de status da unidade funcional da instrução no placar e a posição correspondente da tabela de status de resultados do registro são limpas (mas a próxima instrução usando esta unidade funcional não pode ser emitida neste ciclo, embora esta entrada no tabela (o objeto está vazio), e ao mesmo tempo, Qj e Qk da instrução que precisa ler o operando do componente também são zerados, e Rj e Rk passam para o estado SIM, indicando que estão prontos para serem lidos , mas eles não podem ser lidos até o próximo momento. Ao preencher a tabela, observe que a tabela clki mostra o status no final do clki, portanto, você não pode limpar o status da unidade funcional quando uma instrução é escrita de volta e a próxima instrução usando a unidade funcional é emitida no mesmo ciclo .

Conforme mostrado na figura abaixo, o primeiro LD é reescrito em clk4. Neste momento, a entrada do componente Inteiro está vazia, mas o próximo LD não pode ser emitido em clk4, porque o primeiro LD em clk4 é reescrito e a entrada é limpo neste ciclo.


Além disso, o comando deve verificar se há risco de WAR antes de escrevê-lo novamente , conforme mostrado na ilustração a seguir:

Insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/Aaron503/article/details/131083374
Recomendado
Clasificación