sexta-feira, 16 de dezembro de 2011

Unidade de Processamento Gráfico de Propósito Geral (GPGPU)


(Resenha Capítulo 10)

A Unidade de Processamento Gráfico ou GPU (do inglês Graphics Processing Unit) é um tipo de microprocessador voltado para processar dados gráficos (como imagens e modelos 3D). Elas são comumente utilizadas em computadores pessoais, estações de trabalho e videogames. As GPUs computam fluxos de dados e cálculos aritméticos com grande eficiência. Além disso, é possível encontrar processadores gráficos com preço acessível. Porem, estas não lidam bem com códigos seqüenciais ou recursivos.
 Tendo em vista essa característica das GPUs, começou-se a pensar na possibilidade de utilizar processadores gráficos para computar aplicações que são normalmente executadas em processadores comuns a fim de se obter um melhor desempenho. Surgindo, assim, uma nova técnica, a Unidade de Processamento Gráfico de Propósito Geral ou GPGPU (do inglês General Purpose Graphics Processing Unit), que utiliza a GPU não apenas para tarefas de renderização gráfica, mas também para outras aplicações como inteligência artificial e cálculos numéricos.

Figura1 - Comparação entre CPUs e GPUs modernas em FLOPS

A Figura 1 deixa claro o porquê de existirem tantas pesquisas no uso de GPUs para processamento geral. Nela podemos ver que o poder de computação (em FLOPS) de GPUs modernas são mais fortes que os de CPUs. Alem disso, os processadores gráficos possuem uma taxa de evolução de desempenho mais rápida que a Lei de Moore. Ou seja, se continuar nesse ritmo, a distância entre CPUs e GPUs tende a cresce.
Outro ponto importante está no progresso da plataforma de software utilizada nos processadores gráficos. Inicialmente pesquisadores tinham construir instruções assembly para comandar a computação na GPU. Mas, hoje em dia, linguagens como HLSL e OpenGL tornaram mais fácil de escrever o código de hardware. A interface CUDA possibilitou a pessoas não familiarizadas com computação gráfica tirassem vantagem do uso da GPU em suas aplicações de computação.
É possível encontrar diversas aplicações baseadas em GPGPU recentes para as áreas de geociência, finanças, física e etc. Todas elas envolvem computação intensiva e tarefas com processamento altamente paralelo. Uma dessas aplicações é o calculo de operações de álgebra linear, que envolve o processamento de matrizes, onde os dados das matrizes podem ser separados em blocos e calculados separada e paralelamente. Outra aplicação utiliza GPU pra calcular operações de Banco de Dados, executando operações de “busca relacional” (relational query), seleção conjunta e operações de agregação. Aplicações de simulação de fluido utilizam cálculos massivos de equações diferenciais que podem ser processadas de forma mais eficiente com o uso de GPUs.
Na Literatura pode-se encontra diversas outras aplicações baseadas em GPGPU que conseguiram melhor desempenho do que quando usadas com processadores convencionais. Isso faz concluir que essa abordagem na verdade representa mais uma possibilidade de técnica que podem ser utilizadas para conseguir um melhor desempenho computacional. Assim, o uso de uma CPU ou GPU em uma determinar situação irá depender das características da aplicação.


Principais Referências:
  • Liu, Younquan & Wu, Enhua. Emerging Technology about GPGPU. Circuits and Systems, 2008. APCCAS 2008. IEEE Asia Pacific Conference.
  • Crow, Thomas S. Evolution of the Graphical Processing Unit. University of Nevada. Dezembro, 2004.
  • Dinh, Minh T. GPUs - Graphics Processing Units. Institute of Computing Science, University of Innsbruck. Julho, 2008.

segunda-feira, 12 de dezembro de 2011

Apresentação PCI Express

Para os interessados em aprender um pouco mais sobre PCI-Express e QuickPath, abaixo está o link da apresentação de meu grupo (Wolgrand Cardoso, Ana Clauda e Brian Viegas) na disciplinca de Arquitetura de Computadores sobre o assunto:

PCI - Express/QuickPath: Apresentação

quarta-feira, 7 de dezembro de 2011

Arquiteturas das FPGAs

(Resenha Capítulo 9)
Figura 1. Arquitetura de FPGAs Modernas

           As FPGAs (Field Programmable Gate Array) são dispositivos semicondutores para processamento digital que tiveram sua origem a partir da evolução do conceito de PLDs e CPLDs e da indústria de memórias de leitura programáveis (PROM). Elas podem ser usadas para construção de uma vasta gama de dispositivos de hardware. Os FPGAs possuem baixo custo de prototipação e boa flexibilidade.
        Para especificar o funcionamento de FPGA normalmente costuma-se utilizar algum software de designe (como Altera) que possui uma linguagem própria e uma série de ferramentas que facilitam a programação do FPGA. As estruturas de hardware destacadas na Figura 1 são selecionadas pelo software de design a partir das escolhas de um projetista. O software para design seleciona as estruturas apropriadas para atingir as metas desejadas, que podem ser o melhor desempenho possível ou usar a menor quantidade de energia.
         A arquitetura de um FPGA é em sua grande maioria composta por Elementos Lógicos (Logic Elements - LE), dispostos em malhas ao longo de todo o equipamento. Os Elementos Lógicos possuem duas partes: Look-Up Tables (LUT), que podem implementar funções comuns de lógica, tais como portas AND ou OR, e registros que podem implementar lógica síncrona, como flip-flops.
      Outras estruturas de hardware dedicadas, além dos LEs, estão presentes para auxiliar na implementação de funções que podem ser definidas pelo usuário e aumentar o desempenho. Estes recursos estão geralmente dispostos em colunas ao longo da FPGA. Um dos tipos de recursos dedicados são as memórias embutidas (Embedded Memory - EM) que podem ser dispostas sem série ou em paralelo com a finalidade de se obter memórias mais robustas. Multiplicadores embutidos podem ser cascateados de forma a facilitar o processamento digital de sinais (PDS), auxiliando na implementação de funções avançadas de Processamento Digital de Sinais.
          Além disso, as FPGAs possuem elementos de entrada e saída (User-selectable I/O Elements), que podem ser dispostos e usados conforme o desejo do projetista. Estes elementos podem ser posicionados e configurados para comunicar o FPGA com outros dispositivos externos presentes no circuito impresso.
        Os elementos de uma FPGA possuem conexões em uma planta contendo rotas reconfiguráveis e registros de configuração (Configurable Routing and Configuration Registers). Estas rotas são extremamente flexíveis, a fim de manter a compatibilidade para troca de informação com uma intensa gama de outras estruturas de hardwares.
       Na Literatura podemos encontrar várias propostas de novas arquiteturas e aperfeiçoamentos nas arquiteturas modernas. Como em [Renovell et al, 2001] que propõe uma mudança na arquitetura clássica a fim de criar uma FPGA com cadeias de digitalização implícita (Implicit-Scan chain). A justificativa deste trabalho está no fato de as FPGAs comuns não conseguirem implementar circuitos digitalizados (Scanned Circuits) de forma fácil.
      Já [Smith et al, 2010] propõe uma otimização arquitetural nas FPGAs modernas usando programação geométrica. Para isso, é utilizado um fremework de programação geométrica que mostra como o dimensionamento dos transistores e a seleção de parâmetros arquiteturais de alto nível podem ser resolvidos como um problema de otimização concorrente.

        Principais Referências
  • Malagoni, Juliana A. et al. Design Digital Utilizando FPGA. Universidade Federal de Uberlândia. Uberlândia - MG, Brasil.
  • Smith, Alastair M. et al. FPGA Architeture Optimization Using Geometric Programming. IEEE Transactions on Computer-Aided Design of Integrated Circuits ans Systems. Volume 29, Nº 8. Agosto, 2010.
  • Renovell, M. et al. IS-FPGA: A New Symmetric FPGA Architeture with Implict SCAN. IEEE. 2001.

quarta-feira, 16 de novembro de 2011

Número de Operendos das Instruções e sua Localização

(Resenha Capítulo 7)

          Uma das principais características do conjunto de instruções compreensível por um processador é o numero e a localização de seus operandos indicados em uma instrução aritmética ou lógica.
          Uma dos primeiros formatos de instrução projetados possuía quatro operandos, conforme abaixo:


Cod. Op.
Op.1
Op.2
Op.3
End. Prox. Instruc.


          Este formato de instrução (não usado mais) era completo, possuindo a localização de todos os operandos, também trazia a localização da próxima instrução a ser executada. Uma vantagem deste formato de instrução é o fato de dispensar as instruções de desvio incodicional, pois o endereço de desvio consta na instrução. A desvantagem deste formato está na grande quantidade de espaço de espaço em memória que ela ocupa, principalmente por que uma grande quantidade de instruções não precisarem de três operandos.
          Em algumas arquiteturas, as instruções possuem três operandos, dois  operandos-fonte e um operando-destino, como por exemplo em

Cod. Op.
Op.1
Op.2
Op.3

onde Op.1 e Op.2 são os operandos-fonte e Op.3 é  o operando-destino. Um problema neste formato de instrução acontece quando as operações repetem os operandos (Op.2 = Op.3, por exemplo). Isso acontece normalmente quando se deseja incrementar ou decrementar o valor de uma variável.
          Tendo isso em vista, algumas arquiteturas utilizam instruções com apenas dois operandos

Cod. Op.
Op.1
Op.2

onde Op.2 é operando-fonte e também operando-destino.
          Quanto à localização dos operandos especificados por uma instrução, podemos encontrar arquiteturas onde podem ser realizados acessos aos operandos diretamente a partir da memória principal. Por exemplo, nestas arquiteturas podemos ter instruções aritméticas/lógicas tais como:

Cod. Op.
M1
R1
R2

Cod. Op.
M1
M2
R2

Cod. Op.
M1
M2
M3

onde R1 e R2 são registradores e M1,  M2 e  M3 são endereços de locações de memória. Em um outro extremo, existem arquiteturas onde todos os operandos encontram-se apenas em registradores. As instruções aritméticas/lógicas são todas do tipo:

Cod. Op.
R1
R2
R3

Cod. Op.
R1
R2

          A partir do número de operandos explicitamente referenciados e da localização destes operandos, podemos classificar as arquiteturas nos seguintes tipos: 

Arquiteturas memória-memória: as instruções aritméticas/lógicas usam três operandos e todos os operandos podem estar na memória.

Arquiteturas registrador-memória: as instruções aritméticas/lógicas usam dois operandos, sendo que apenas um deles pode residir na memória.
  
Arquiteturas registrador-registrador: as instruções aritméticas/lógicas usam três operandos, todos em registradores. Neste caso, apenas duas instruções acessam diretamente a memória:  LOAD e  STORE. A instrução  LOAD carrega em um registrador um dado armazenado na memória e  instrução STORE armazena na memória o conteúdo de um registrador.  

          Arquiteturas memória-memória e registrador-memória apresentam como vantagem um menor número de instruções no código do programa, já que não é necessário carregar previamente em registradores os operandos-fonte de uma instrução aritmética/lógica, como acontece em uma arquitetura registrador-registrador.  Por outro lado, a existência de instruções aritméticas/lógicas mais poderosas torna mais complexa a implementação da arquitetura. As arquiteturas Intel 80x86 e Motorola MC680x0 são do tipo registrador-memória. Dentre as arquiteturas memória-memória está o DEC VAX 11.


Principais Referências:
  • Tao, Welfane K. Arquitetura e Organização de Computadores. Cap. 6. 2004, Janeiro.
  • Clícia, M. O conjunto de Instruções do Computador. Cap. 4. 2005, Abril.

sexta-feira, 4 de novembro de 2011

Phase Change Memory- PCM

(Resenha Capítulo 6)

         No início da década passada poucas tecnologias tinha sido propostas para substituir as memórias não-voláteis (NVM) padrão e para ampliar a base de tecnologia Flash. À medida que o final daquela década se aproximava, pôde-se notar que apenas uma das tecnologias propostas estava demonstrando a capacidade de entrar no mercado NVM amplamente e ser a memória dominante para a próxima década: a tecnologia de memória de mudança de fase (Phase Change Memory (PCM)) criada pela IBM.
Esta memória é feito de uma liga de calcogeneto que é também encontrado em CDs e DVDs regraváveis. No nível de discos óptico, um feixe de laser com intensidade diferente é usado para aquecer um volume pequeno para mudar o material entre os estados cristalino e amorfo. O estado das células de memória é determinado pela refletividade da camada de memória.  Na PCM baseadas em silício, uma corrente elétrica de diferentes magnitudes é lançada por um elemento aquecedor até um material calcogeneto e um aquecimento Joule local é usado para alterar o volume programável em torno da região de contato.
O uso de correntes altas e rápido resfriamento “congela” o material em um estado amorfo com alta resistência. O tempo necessário para mudar para o estado amorfo é na maioria das vezes inferior a 100ns. Uma corrente com tempo de pulso médio é utilizado para recristalizar a região, levando a um estado de cristal com baixa resistência. Uma corrente pequena sem aquecimento Joule é usada para leitura da memória, diferenciando os estados de alta (amorfo) e baixa (cristalino) resistência.
PCM fornece um novo conjunto de características interessantes, combinando características de memórias não voláteis e DRAM (Tabela 1).

Tabela 1 - Comparação entre PCM, memórias não voláteis (EEPROM, NOR e NAND) e DRAM.
Do ponto de vista da aplicação, PCM pode ser explorada por todos os sistemas de memória. Suas características permitem faz com que possam ser usadas em uma base ampla de aplicações, proporcionando um valor agregado significativo. Em particular PCM pode ser usado:
  1. em sistemas sem fio para o armazenamento de código executado diretamente, estruturas de dados semi-estática e arquivos. A forma como o PCM altera seus bits permite que seja tratada como uma memória direta de escrita, como uma DRAM. Isto reduz significativamente os requisitos da DRAM, reduzindo o custo do subsistema desta memória;
  2. em aplicações embarcadas, similar aos sistemas sem fio, em particular, como substituto do Flash. 
  3.  nos subsistemas de armazenamento de estado sólido para armazenar páginas acessadas freqüentemente e para armazenar os elementos que são mais facilmente gerenciados quando manipulados no local
  4. em plataformas computacionais, explorando a sua não- volatilidade para reduzir o consumo de energia. Os blocos DRAMs consomem uma boa quantidade de energia para a realização dos sucessivos refreshes. Já os blocos PCM podem simplesmente serem “desligados”. Resultando numa redução do consumo de energia.

A memória PCM possui as capacidades básicas de trabalhar com altos ciclos, baixa voltagem, rápida leitura e escrita e consumo de energia moderado. Por isso empresas como a Samsung têm investido esforços na construção e aplicação destas memórias em dispositivos móveis. Ela começará com um chip de 512 MB. A expectativa é que a memória PCM possa vir a substituir a memória DRAM do computados assim como parte das memórias Flash.


Principais Referências:
  • Atwood, Greg & Bez, Roberto. Current status of Chalcogenide phase change memory. Device Research Conference Digest. IEEE 2005.
  • Bez, Roberto. Chalcogenide PCM: a Memory Technology for Next Decade. R&D Technology Development. Italia, Milão. IEEE 2009.




sexta-feira, 14 de outubro de 2011

Arquiteturas Multicore

(Resenha Capítulo 5)







Introdução

As arquiteturas com um único processador vêm ficando cada vez mais complexas e atingindo o limite de desempenho do hardware, incluindo limites no paralelismo em nível de instrução e limitações de energia. Por isso, têm-se falado bastante nos últimos anos em arquiteturas multicore (ou seja, com mais de uma unidade de processamento) .
Estas arquiteturas exploram a capacidade multithreading dos softwares permitindo que as instruções do programa possam ser executadas por mais de um núcleo simultaneamente. As principais variáveis em uma arquitetura multicore são o numero de processadores no chip, o numero de níveis de memória cache e a extensão que a memória cache é compartilhada. Desta forma existem quatro principais arquiteturas multicore.
A primeira organização possui uma cache L1 dedicada para cada núcleo e cache L2 compartilhada e fora do chip, esta organização é encontrada em alguns chips multicores antigos como o ARM11 MPCore. A segunda organização multicore comumente utilizada possui cache L1 e L2 dedicados para cada núcleo dentro do chip, um exemplo desta arquitetura é a AMD Opteron. A terceira, utilizada pela Core Duo da Intel, possui uma memória cache L1 dedicada e uma L2 compartilhada ambas dentro do chip. A última organização possui três caches L1 e L2 dedicadas a cada núcleo e L3 compartilhada com todos eles. Esta ultima arquitetura é utilizada pelo Core i7 da Intel.
A seguir analisamos as características de processadores que utilizam o conceito de multiprocessamento.

Athlon X2

Uma das maiores vantagens deste processador contra os processadores de dois núcleos da Intel é que o controlador de memória está embutido dentro do processador. Assim, quem controla as memórias e o multiprocessamento é o próprio processador, isso faz que o controlador da placa mãe seja usado apenas para controlar os HDs, as placas de expansão e entre outras aplicações. Isso faz com que se gaste menos na compra da placa mãe e não seja necessário a trocar a placa mãe quando for colocar memórias com clock maiores. Apesar de não ter o melhor processador, a AMD possui processadores de dois núcleos com ótimo custo-benefício.
Os modelos mais modernos deste processador possuem clock de 3200 MHz, duas memórias cache L1 de 64 KB dedicadas, uma memória cache L2 de até 1 MB compartilhada e tecnologia de construção de transistores de 65 nm. Obedecendo, assim, a terceira arquitetura descrita no tópico acima.

Intel Core Duo

                Foi introduzido em 2006, implementando dos processadores x86 superescalares com uma cache L2 compartilhada (terceira arquitetura descrita na Introdução). Cada processador possui a sua memória cache L1 dedicada com 32 KB para instruções e 32 KB para dados.
                Cada núcleo possui uma unidade de controle térmico projetada para gerenciar a dissipação de calor do chip, maximizando o desempenho do processador dentro das restrições térmicas. Além disso, este processador possui uma complexa lógica de gerenciamento de energia e um controlador programável avançado de interrupções (APIC) que executa tarefas como: escalonamento de interrupções de E/S para o núcleo adequado, uso de temporizador que pode ser usado pelo SO para gerar interrupção no núcleo local e interrupções entre processadores.
                O chip Core Duo inclui uma cache L2 de 2 MB compartilhada. A lógica desta cache permite alocação dinâmica do espaço da cache com base nas necessidades atuais do núcleo, de tal forma que a um núcleo possa ser atribuído até 100% da cache L2. O controlador da cache L2 permite que o sistema diferencie entre uma situação onde os dados são compartilhados entre dois núcleos locais.


Embora o uso de múltiplos processadores ser, teoricamente, mais eficiente quando comparado a um computador de um único núcleo, escrever programas que tiram vantagem de vários processadores (programação paralela) possui certa complexidade. Mesmo assim, a tendência é que a quantidade de núcleos dentro do processador aumente mais nos próximos anos.



Principais Referências:
  • Aschermann, Nikolas & Roberto, Paulo. Arquitetura Multicore. Universidade Estadual de Campina. Capinas, SP.
  • Stallings William. Arquitetura e Organização de Computadores. 8ª ed. 2010.
  • Tecnologia Multicore Intel@. Disponível em: <http://www.intel.com/portugues/multi-core/index.htm>



sexta-feira, 30 de setembro de 2011

Tipos e Técnicas de Pipeline


(Resenha Capítulo 4)


         
            Com a constante necessidade de maquinas cada vez mais poderosas, o desperdício de tempo dentro do processador deve ser evitado ao máximo.  A técnica de Pipeline possibilita a execução paralela das micro-instruções. Ou seja, esta técnica permite uma sobreposição temporal das fases de execução de uma instrução. Diante do antigo paradigma onde cada instrução era executada separadamente, passando por todas as fazes de execução no processador (Por exemplo: leitura da memória principal, carregamento nos registradores, utilização da ULA para processamento, escrita no registrado e escrita na memória principal), a utilização do Pipeline dividir esta execução em etapas permitindo a serialização no processamento das instruções.
            Esta técnica foi evoluindo com o tempo e, com isso, incorporando novas idéias de implementação de forma a aumentar o desempenho do processador.  A seguir veremos alguns tipos de Pipeline e como elas funcionam resumidamente.

Superpipele:
            É fácil perceber que um grande número de divisões na execução de uma instrução (numero de estágios de Pipeline) resulta em um melhor desempenho de processamento, pois o numero de instruções executadas em série será maior. Isso se o Pipeline não tiver que ser esvaziado (todos os estágios devem esperar o encerramento de uma instrução especifica) com muita freqüência. O Superpipelining se baseia nestes princípios.
            A desvantagem desta técnica, quando comparado a um Pipeline, é que este possui uma maior complexidade de desenvolvimento e uma maior dependência de detecção de desvios, visto que o esvaziamento do Pipeline resultaria num desperdício de mais estágios.

Pipeline Super Escalar:
            Este Pipeline é obtido aumentando-se o numero de Pipelines. Ou seja, mais de um Pipeline trabalhando de forma paralela no processador. Para que ele tenha um bom desempenho as instruções não devem ter muita latência, facilitando o trabalho sincronizado dos Pipelines. Desta forma o processador deve possuir um bom algoritmo de tratamento de latências.
            A grande vantagem do Pipeline Super Escalar é que o paralelismo na execução das instruções acontece de forma real, possibilitando um grande aumento de desempenho. Os pontos negativos estão no fato de que as micro-instruções devem ser cuidadosamente estudadas e a complexidade no tratamento de desvios aumenta significativamente.

Pipeline com Predição de Desvio:
            Predição de desvios são técnicas utilizadas para evitar o esvaziamento do Pipeline, deixando o fluxo de processamento das instruções contínuo e sem quebras. Estas técnicas podem ser implementadas por Hardware ou Software e são fundamentais para um uso eficiente do Pipeline.
            A predição de desvio pode ser estática ou dinâmica. Na predição estática a unidade de controle assume que o desvio sempre ocorrerá, resultando numa taxa de 50% de acerto. Na predição dinâmica a unidade de controle utiliza informações coletadas em tempo de execução para decidir-se sobre o desvio.

Pipeline com Execução Fora de Ordem:
            A Execução Fora de ordem faz o processador reordenar as instruções para melhor aproveitar o Pipeline e evitar a seu esvaziamento. Esta reordenação é complexa devido ao fato de que instruções que dependem uma das outras devem ser tratadas de forma especial. O uso da execução fora de ordem necessita de um controle para reordenação das instruções após executá-las.

            Estes “tipos de Pipiline” são meramente teóricos, na prática eles podem possuir mais de uma dessas características a fim de obter um melhor de desempenho.



Principais Referências:

  • Jourdan, Stéphan; Carrière, Dominique & Litaize, Daniel. A High Out-of-Order Issue Symmetric Superpipeline Superscalar Microprocessor. França.
  • Sampaio, Daniel L. & Braz, Marco H. Arquiteturas Superescalares.