quarta-feira, 28 de maio de 2014

CLASSIFICASSÃO DE FLYNN



Taxonomia de Flynn



Introdução ao Processamento Paralelo e de Alto Desempenho



CLASSIFICAÇÃO DE  FLYNN
PARA ARQUITETURAS PARALELAS DE COMPUTADORES


01.  SISD

Na classe SISD (Single Instruction,  Single Data), um único fluxo de instruções atua  sobre um único fluxo de dados.

Corresponde ao tradicional modelo Von Neumann. Um
processador executa seqüencialmente um conjunto de instruções sobre um conjunto de dados.

Exemplo:
-  Computadores com um processador (PC’s e Mainframes).



02.            SIMD

 Na classe SIMD (Single Instruction, MultipleData), uma única instrução é  executada ao mesmo tempo sobre múltiplos dados.


   Envolve múltiplos processadores (escravos) sob o co
ntrole de uma única unidade de controle (mestre) executando simultaneamente a mesma instrução em diversos conjuntos de
dados. Arquiteturas SIMD são utilizadas para manipulação de matrizes e processamento de imagens.

Uma única unidade de controle busca a instrução que
comanda varias unidades aritméticas que executam em paralelo, cada uma delas com seus próprios dados;

Exemplo:

- Arrayde processadores (vetoriais e matriciais) e alguns
supercomputadores;


 03.  MISD

      
Na classe MISD (MultipleInstruction, SingleData), múltiplos
fluxos de instruções atuam sobre um único fluxo de  dados.

Envolve múltiplos processadores executando diferent
es instruções em um único conjunto de dados. Geralmente, nenhuma arquitetura é classificada como MISD, isto é, não existem representantes desta categoria. Alguns autores cons
ideram arquiteturas pipeline como exemplo deste tipo de organização.


04.       MIMD

    Em uma máquina MIMD (Multiple Instruction, Multiple Data),
cada unidade de controle C recebe um fluxo de instruções  próprio  e repassa-o para sua unidade processadora P.

Envolve múltiplos processadores executando diferentes instruções em diferentes conjuntos de dados, de maneira independente. Esta classe engloba a maioria doscomputadores paralelos.

Os sistemas distribuídos estão nesta categoria, ou um conjunto de computadores  independentes, cada um com seu contador de programa, conjunto de instruções e dados.



Esta categoria dividi-se em duas categorias por tipo de memória:

- Memória Compartilhada: Espaço de endereçamento compartilhado;

- Memória Local ou Individual: espaço de endereçame
nto próprio.


RESUMINDO  PODEMOS TER O SEGUINTE RELATO:


MIMD versus SIMD

Ambos os tipos de organizações computacionais apresentam vantagens e desvantagens. Arquiteturas SIMD, por apresentarem fluxo único de instruções, oferecem facilidades para a programação e depuração de programas paralelos. Além disso, seus elementos de processamento são simples, pois são destinados à computação de pequena granulação. Por outro lado, arquiteturas MIMD apresentam grande flexibili
dade para a execução de algoritmos paralelos (arquiteturas SIMD geralmente se destinam a processamento de propósito específico), e apresentam bom desempenho em virtude de seus elementos de processamento serem
assíncronos.

A classificação de Flynn apresenta alguns problemas. Ela não é abrangente o suficiente para incluir alguns computadores modernos (por exemplo, processadores vetoriais e máquinas de fluxo de dados), falhando também, no que concerne a
extensibilidade da classificação. Outro inconveniente desta classificação é a falta de hierarquia. A classificação MIMD, por exemplo, engloba quase todas as arquiteturas paralelas sem a
presentar subníveis. No entanto, apesar de antiga (proposta em 1972), a classificação de Flynn é bastante concisa e a mais utilizada.

A fim de acrescentar novas arquiteturas paralelas
surgidas, sem descartar a classificação de Flynn (visto que esta é muito difundida), Duncan propôs uma classificação mais completa, e que permite apresentar uma visão geral dos estilos
de organização para computadores paralelos
da atualidade.


sábado, 17 de maio de 2014

ARQUITETURA CISC E RISC



Processadores RISC X Processadores CISC


Introdução


Sempre houve uma grande polêmica em torno de qual dessas plataformas é melhor. Na verdade, você já deve ter ouvido muito boatos como "Os Macs são mais rápidos por que tem chips RISC" ou algo do gênero. O objetivo deste artigo é falar um pouco sobre as duas plataformas e como elas coexistem atualmente.

Um processador CISC (Complex Instruction Set Computer, ou "computador com um conjunto complexo de instruções"), é capaz de executar várias centenas de instruções complexas diferentes, sendo extremamente versátil. Exemplos de processadores CISC são o 386 e o 486.

   Na década de 80, a tendência era construir chips com conjuntos de instruções cada vez mais complexos. Alguns fabricantes porém, resolveram seguir o caminho oposto, criando o padrão RISC (Reduced Instruction Set Computer, ou "computador com um conjunto reduzido de instruções"). Ao contrário dos complexos CISC, os processadores RISC são capazes de executar apenas algumas poucas instruções simples. Justamente por isso, os chips baseados nesta arquitetura são mais simples e muito mais baratos. Outra vantagem dos processadores RISC, é que, por terem um menor número de circuitos internos, podem trabalhar a freqüências mais altas. 


RISC e CISC





  A vantagem de uma arquitetura CISC é que já temos muitas das instruções guardadas no próprio processador, o que facilita o trabalho dos programadores, que já dispõe de praticamente todas as instruções que serão usadas em seus programas. No caso de um chip estritamente RISC, o programador já teria um pouco mais de trabalho, pois como disporia apenas de instruções simples, teria sempre que combinar várias instruções sempre que precisasse executar alguma tarefa mais complexa. Seria mais ou menos como se você tivesse duas pessoas, uma utilizando uma calculadora comum, e outra utilizando uma calculadora cientifica. Enquanto estivessem sendo resolvidos apenas cálculos simples, de soma, subtração, etc. quem estivesse com a calculadora simples poderia até se sair melhor, mas ao executar cálculos mais complicados, a pessoa com a calculadora científica disporia de mais recursos.



RISC x CISC        

    Máquinas CISC (Complex Instruction Set Computer) têm um conjunto de instruções grande, de tamanhos variáveis, com formatos complexos. Muitas dessas instruções são bastante complicadas, executando múltiplas operações quando uma única instrução é dada (por exemplo, é possível realizar um loop complexo usando apenas uma operação assembly). O problema básico com máquinas CISC é que um conjunto pequeno de instruções complexas torna o sistema consideravelmente mais lento. Os projetistas decidiram retornar a uma arquitetura mais simples, delegando ao compilador a responsabilidade de produzir código eficiente com esse novo conjunto de instruções. Máquinas que utilizam esta filosofia são chamadas de máquinas RISC.
     A arquitetura RISC (Reduced Instruction Set Computer), como o próprio nome já diz, tem como principal objetivo simplificar as instruções de modo que elas possam ser executadas mais rapidamente. Cada instrução executa apenas uma operação, que são todas do mesmo tamanho, tem poucos formatos, e todas as operações aritméticas devem ser executadas entre registradores (dados da memória não podem ser utilizados como operandos). Praticamente todos os conjuntos de instruções (para qualquer arquitetura) lançados desde 1982 têm sido RISC, ou alguma combinação entre RISC e CISC.
    Membros da família x86 de arquitetura Intel são conhecidos como máquinas CISC, enquanto que a família Pentium e processadores MIPS são conhecidos como máquinas RISC.
Vamos montar uma tabela com as principais diferenças entre as arquiteturas. Isto deveria ser suficiente para responder a maioria das questões de concurso sobre o assunto.
RISC
CISC
Múltiplos conjuntos de registradores, muitas vezes superando 256
Único conjunto de registradores, tipicamente entre 6 e 16 registradores
Três operandos de registradores permitidos por instrução (por ex., add R1, R2, R3)
Um ou dois operandos de registradores permitidos por instrução (por ex., add R1, R2)
Passagem eficiente de parâmetros por registradores no chip (processador)
Passagem de parâmetros ineficiente através da memória
Instruções de um único ciclo (ex. load e store)
Instruções de múltiplos ciclos
Controle hardwired (embutido no hardware)
Controle microprogramado
Altamente paralelizado (pipelined)
Fracamente paralelizado
Instruções simples e em número reduzido
Muitas instruções complexas
Instruções de tamanho fixo
Instruções de tamanho variável
Complexidade no compilador
Complexidade no código
Apenas instruções load e store podem acessar a memória
Muitas instruções podem acessar a memória
Poucos modos de endereçamento
Muitos modos de endereçamento

terça-feira, 13 de maio de 2014

FORMAS DE EXECUÇÃO DE PROGRAMAS



O que é : Tradução, Compilação  e  Interpretação.


Execução de programas 

Um programa de computador não é escrito em uma linguagem que a máquina entende, por isso é necessário haver uma tradução do programa para a linguagem binária. 


1) Montagem (Assembler = Montador)

Tradução de um programa em linguagem de montagem (código fonte) para linguagem binária (código objeto).

O programa que faz a tradução é o montador (ou Assembler)


Funções básicas: 

  • Examinar a correção de cada instrução
  • Substituir códigos de operações simbólicos por valores numéricos
  • Substituir nomes simbólicos de endereços por valores numéricos
  • Converter valores de constantes para binários
  • Reservar espaço de memória para armazenamento de instruções e dados


2 ) Compilação

Traduz o programa-fonte escrito em linguagem de alto nível (linguagem fonte) para o programa-objeto escrito, por exemplo, em linguagem de máquina (binária). Pode-se gerar um programa intermediário no meio do processo escrito em Assemply, por exemplo.

O tempo para realizar esta tarefa é chamado tempo de compilação. Em seguida executa o programa-objeto. O tempo para realizar esta tarefa é chamado tempo de execução.

O programa que faz a tradução é o compilador.

Compilador executa duas funções básicas: análise e síntese


Análise:

  • Análise léxica: decompõe o programa fonte em seus elementos individuais distintos e verifica se estão de acordo com as regras da linguagem
    (ex: associa strings de caracteres a comandos, operadores, variáveis,....)
    Resultado: conjunto de tokens

  • Análise sintática: cria as estruturas para os comandos e verifica a correção das estruturas (ex: tem int antes de main, tem abre e fecha parênteses)
    Resultado: árvore sintática representando a estrutura do programa

  • Análise semântica: verifica as regras semânticas estáticas da linguagem (ex: estar atribuindo valores do tipo correto para uma variável: Parcela1=1.5, poderia dar erro pois variável Parcela1é do tipo int)
Síntese: gera o programa-objeto 

  • Geração de código: gera o programa-objeto

  • Otimização de código: tenta tornar o programa-objeto mais eficiente

Exemplo de linguagem compilada: C, Pascal


Montagem x Compilação:

Diferença está na complexidade. Na montagem existe uma relação 1:1 entre o código na linguagem de montagem e o código na linguagem de máquina. Já na compilação a relação é múltipla, cada instrução do código fonte gera múltiplas instruções no código de máquina.


3) Ligação ou link-edição

Algumas rotinas já existem codificadas no sistema, por exemplo, rotinas para entrada e saída de dados, de modo que o programador não precisa codificá-las.
 
Exemplo: printf(), readln(), rotinas matemáticas como seno e coseno.
 
Estas rotinas são armazenadas em bibliotecas que são incluídas no código objeto gerado pelo compilador.
 
Para que o código da subrotina externa seja anexado ao código objeto utiliza-se o processo de ligação. Este processo examina todo o código objeto e procura por referências externas não resolvidas assinaladas pelo compilador.
 
Ele procura pela rotina no sistema e se a encontra, inclui seu código no código objeto, caso contrário, gera uma mensagem de erro.


4) Interpretação

A partir do código fonte realiza as três fases (compilação, ligação e execução) comando a comando. Lê uma instrução, compila, liga e executa. Depois lê a próxima instrução e faz os mesmos 3 passos.

O programa executa estas três fazes é o interpretador.

Exemplo de linguagem interpretada: Java


Compilação X Interpretação


Tempo de execução:

É maior no na interpretação pois cada vez que o programa é executado, o interpretador executa as três fases. Já o compilador é só executar o programa-objeto já gerado na primeira vez.



Consumo de memória:

O interpretador precisa permanecer na memória durante todo o tempo de execução. Já o compilador fica na memória somente durante o tempo de compilação. Quando o programa é executado, somente o programa-objeto fica na memória.

Repetição da interpretação:
Sempre que um programa for utilizado, terá que ser interpretado novamente. Isso é um problema para os programas que são muito utilizados.

No caso de loops, cada instrução do loop é interpretada em todos os passos do loop. No caso da compilação, a tradução para código-objeto ocorre só uma vez pois o loop não e executado enquanto a tradução é feita.

Por tanto, o método de interpretação torna-se mais lento que o de compilação.

Detecção de erros:

No método de compilação, a identificação de erros durante a fase de execução fica sempre difícil, pois não há mais relação entre comandos do código fonte e instruções do executável.
 
No método de interpretação, cada comando é interpretado e executado individualmente, a relação entre código fonte e executável é mais direta e o efeito da execução (certa ou errada) é direta e imediatamente sentido.

Por tanto, erros são detectados de forma mais fáci