Por que os compiladores precisam ser “mais inteligentes” para a arquitetura do conjunto de instruções RISC?

Por que os compiladores precisam ser “mais inteligentes” para a arquitetura do conjunto de instruções RISC?

A arquitetura de conjunto de instruções reduzida (RISC) visa reduzir o número de instruções, melhorando assim o desempenho. A única desvantagem dessa abordagem é que os compiladores precisam ser "mais inteligentes".

O que minha palestrante quis dizer quando disse "compiladores precisam ser mais inteligentes" e por que isso é tão

Responder1

RISC, quando dito honestamente, significa "Complexidade reduzida do conjunto de instruções" - O número de instruções não é necessariamente reduzido, mas cada instrução é mais simples, em termos dos ciclos de máquina necessários para executá-la e em termos do número de portas ( ou armazenamento de microcódigo) dedicado à sua implementação.

A teoria (que é pelo menos parcialmente realizada) é que, ao reduzir a quantidade de lógica de controle, mais espaço no chip fica disponível para registros e caminho de dados. Conseqüentemente, as máquinas RISC normalmente têm de 2 a 4 vezes mais registros que suas contrapartes CISC.

Isso deixa o compilador para fazer o trabalho dessa lógica de controle omitida, incluindo "agendar" operações (sequenciá-las) para que, digamos, você não faça duas adições consecutivas, mas faça uma adição e depois uma mudança (e assim por diante). registros diferentes) para que tanto o somador quanto o shifter sejam utilizados de maneira ideal. E o compilador também deve gerenciar o conjunto de registros, para otimizar a entrada e saída dos registros, minimizando os acessos ao armazenamento. Além disso, o compilador deve saber como utilizar melhor as instruções estranhas (como "deslocar para a esquerda e mascarar com literal"), pois elas geralmente apresentam algum cenário (talvez estranho) em que são relativamente poderosas.

Como resultado, as instruções geradas por um bom compilador RISC são virtualmente impossíveis de decifrar. Mesmo que você conheça bem o conjunto de instruções, descobrir que algum valor de meia hora atrás ainda está no registro 12 é, na melhor das hipóteses, difícil, mesmo que não fosse pelas complicadas operações de mudança e máscara que ocorrem o tempo todo.

(Para aqueles que aparentemente não acreditam que eu sei do que estou falando, estive envolvido pela primeira vez no RISC com o IBM 801, no início dos anos 70, e tratei pelo primeiro nome com George Radin e Marty Hopkins .)

Responder2

Como há menos instruções em uma CPU RISC, há menos chances de que uma única instrução de alto nível seja bem traduzida para um único código de operação em linguagem de máquina.

Um sinônimo para CPU RISC é “arquitetura de armazenamento de carga”. Basicamente, isso significa que as instruções RISC que realmente funcionam geralmente funcionam apenas em registradores. Se você quiser trabalhar com valores armazenados na RAM, terá que emitir instruções LOAD explícitas, enquanto CPUs CISC como x86 possuem instruções que fazem isso automaticamente. Historicamente, as CPUs RISC tiveram mais registros do que x86 - e um bom código gerenciará bem os registros disponíveis para evitar acessos desnecessários à memória, o que significa que um compilador precisa levar isso em consideração.

Outra coisa é que as CPUs RISC normalmente fornecem apenas a "infraestrutura" mínima necessária para a ligação.

Por exemplo, CPUs x86 têm uma noção de "pilha", onde você pode enviar valores e depois "retirá-los" (existem PUSHinstruções POP). Há também uma CALLinstrução - ela empurra o ponteiro da instrução atual na pilha e depois salta para o endereço de destino - normalmente uma sub-rotina ou função. Uma RETinstrução pode então ser emitida posteriormente para retirar o ponteiro da instrução salva e retomar a função original. Aninhar sub-rotinas é conveniente e você pode usar PUSHe POPcolocar parâmetros para sub-rotinas facilmente.

Em um MIPS, por exemplo, tudo que você tem é um jalpara "Jump and Link" - ele coloca o ponteiro da instrução atual em um registro e então salta para esse endereço. Se você quiser fazer algo como uma pilha ou CALLinstrução x86, terá que fazer isso manualmente. Isso requer mais inteligência do compilador.

Responder3

Os processadores CISC (Computação de Conjunto de Instruções Complexas) têm uma gama maior de instruções disponíveis do que os processadores RISC (Computação de Conjunto de Instruções Reduzidas).

Um exemplo de multiplicação em CISC seria: MUL 1:3, 4:2 (Multiplicar 1:3 e 2:4). Este comando carregaria o valor na posição 1:3 em seu registro, carregaria o valor em 4:2, multiplicaria-os e armazenaria de volta em 1:3

CPUs RISC poderiam ter que:

  • CARGA A, 1:3
  • CARGA B, 4:2
  • PRODUTO A, B
  • ARMAZENAR 1:3, A

...4 operações RISC para 1 operação CISC.

Como o RISC requer mais operações até mesmo para fazer o cálculo de multiplicação mais simples - imagine quanto trabalho a mais é necessário para coisas como renderização de vídeo ou jogos?

Com isso em mente - os compiladores que constroem o software a partir do código inserido por um programador precisam ser "mais inteligentes" para saberem como simplificar peças complexas de código e comandos complexos para a arquitetura RISC.

Espero que isso faça sentido. Para leitura adicional, pode valer a pena dar uma olhada em: http://www.engineersgarage.com/articles/risc-and-cisc-architecture?page=5

informação relacionada