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

3

A Reduced Instruction Set Architecture (RISC) tem como objetivo 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 meu palestrante quer dizer quando disse "os compiladores precisam ser mais inteligentes" e por que isso é tão

    
por Computernerd 07.03.2014 / 10:09

3 respostas

7

RISC, quando afirmado com honestidade, significa "Complexidade do Conjunto de Instruções Reduzidas" - 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 portões (ou loja de microcódigo) dedicados a implementá-lo.

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

Isso faz com que o compilador faça o trabalho dessa lógica de controle omitida, incluindo as operações de "planejamento" (sequenciando-as) para que, digamos, você não faça dois acréscimos consecutivos, mas faça um acréscimo (e em registros diferentes) para que tanto o somador quanto o câmbio sejam utilizados de maneira ideal. E o compilador também deve gerenciar o conjunto de registros, para otimizar o movimento de entrada e saída dos registros, minimizando os acessos de armazenamento. Além disso, o compilador deve saber como utilizar melhor as instruções ímpares (como "deslocar para a esquerda e máscara com literal"), pois elas geralmente têm um 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 se você conhece bem o conjunto de instruções, descobrir que algum valor de meia hora atrás ainda está no registro 12 é difícil, na melhor das hipóteses, mesmo que não sejam as operações complicadas de mudança e máscara ocorrendo o tempo todo.

(Para aqueles que aparentemente não acreditam que eu sei do que estou falando, eu me envolvi primeiramente no RISC com o IBM 801, no início dos anos 70, e eu estava em uma base de primeiro nome com George Radin e Marty Hopkins.)

    
por 07.03.2014 / 14:21
2

Como há menos instruções em uma CPU RISC, há menos chance de que uma única instrução de alto nível seja bem traduzida para um único código de operação de 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 com registros. Se você quer trabalhar com valores armazenados na RAM, você tem que emitir instruções LOAD explícitas, enquanto que as do CPU CISC como x86 possuem instruções que fazem isso automaticamente. As CPUs RISC têm historicamente 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 conta.

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

Por exemplo, as CPUs x86 têm uma noção de "pilha", na qual você pode enviar valores e depois "removê-los" (há PUSH e POP instruções). Há também uma instrução CALL - ela vai empurrar o ponteiro de instrução atual na pilha e depois pular para o endereço de destino - normalmente uma sub-rotina ou função. Uma instrução RET pode então ser emitida posteriormente para remover o ponteiro de instrução salvo e retomar a função original. Sub-rotinas de aninhamento é conveniente, e você pode usar PUSH e POP para colocar parâmetros para sub-rotinas facilmente.

Em um MIPS, por exemplo, tudo que você tem é um jal para "Jump and Link" - ele coloca o ponteiro de instrução atual em um registrador e depois pula para esse endereço. Se você quiser fazer algo como uma pilha ou a instrução x86 CALL , você precisa fazer isso manualmente. Isso requer mais inteligência do compilador.

    
por 07.03.2014 / 12:58
0

Processadores CISC (Complex Instruction Set Computing) têm uma gama maior de insturções disponíveis do que os Processadores RISC (Reduced Instruction Set Computing).

Um exemplo de multiplicação na CISC seria: MUL 1: 3, 4: 2 (Multiplicar 1: 3 e 2: 4). Este comando iria carregar o valor na posição 1: 3 no seu registrador, carregar o valor em 4: 2, juntá-los e armazená-los novamente em 1: 3

CPUs RISC poderiam ter que:

  • CARREGAR A, 1: 3
  • CARREGAR B, 4: 2
  • PROD A, B
  • LOJA 1: 3, A

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

Como o RISC requer mais operações para fazer o cálculo de multiplicação mais simples - imagine quanto mais trabalho é 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 digitado por um programador precisam ser "mais inteligentes" para que eles possam simplificar peças complexas de código e comandos complexos para a Arquitetura RISC.

Espero que isso faça sentido Para uma leitura mais aprofundada, pode valer a pena olhar para: link

    
por 07.03.2014 / 10:22