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.