Arquivos

Arquivo para a categoria ‘acadêmico’

CUDA para CPU – MCUDA

19 19UTC maio 19UTC 2010 Labaki Deixar um comentário

Vejam que idéia interessante:

.

CUDA é um modelo de programação de paralelismo de dados que oferece várias abstrações-chave como thread blocks, hierarquia de memória e barreira de sincronização para escrever aplicações. Esse modelo tem sido provado eficiente para a programação de GPUs.

Esse paper de Stratton, Stone & Hwu (2008) descreve um framework chamado MCUDA, que permite que programas CUDA sejam executados eficientemente em multi-core CPUs de memória compartilhada.

Com esses resultados, eles mostram que CUDA pode ser um model de programação paralela eficiente não só para arquiteturas de GPUs.

.

Clique aqui para ver o artigo.

Clique aqui para ver a página de download do MCUDA.

Categoriasacadêmico

The OpenCL Programming Book

13 13UTC abril 13UTC 2010 padbr Deixar um comentário

The book starts with the basics of parallelization, covers the main concepts, grammar, and setting up a development environment for OpenCL, concluding with source-code walkthroughs of the FFT and Mersenne Twister algorithms written in OpenCL.
It is highly recommended for those wishing to get started on programming in OpenCL.

Format: Adobe Reader (PDF)
File Size: 3.49MB
Digital: 246 pages
Price: USD 19.50
Publisher: Fixstars Corporation
Author: Fixstars Corporation (Ryoji Tsuchiyama, Takashi Nakamura, Takuro Iizuka, Akihiro Asahara, Satoshi Miki)

Published Date: 3/31/2010

.
OpenCL Programming Contents

Introduction to Parallelization
Why Parallell
Parallel Computing (Hardware)
Parallel Computing (Software)
Conclusion
OpenCL
What is OpenCL?
Historical Background
An Overview of OpenCL
Why OpenCL?
Applicable Platforms
OpenCL Setup
Available OpenCL Environments
Developing Environment Setup
First OpenCL Program
Basic OpenCL
Basic Program Flow
Online/Offline Compilation
Calling the Kernel
Advanced OpenCL
OpenCL C
OpenCL Programming Practice
Case Study
FFT (Fast Fourier Transform)
Mersenne Twister
Notes
.
Ver detalhes e comprar.
CategoriasNoticia, acadêmico, dica

Mini-simpósio no MECOM-CILAMCE 2010

13 13UTC março 13UTC 2010 Labaki Deixar um comentário

Introdução do nosso mini-simpósio no MECOM-CILAMCE 2010 -IX Congresso Argentino de Mecânica Computacional e XXXI Congresso Ibero-Latino-Americano de Mecânica Computacional. Esses congressos acontecerão entre 15 e 18 de novembro de 2010 em Buenos Aires. Prepare seu trabalho!

Title

High Performance Computing on Graphics Hardware (GPGPU)

Organizers

Euclides Mesquita, euclides@fem.unicamp.br
Josué Labaki, labaki@fem.unicamp.br
Luiz Otávio Saraiva Ferreira lotavio@fem.unicamp.br

Department of Computational Mechanics DMC
School of Mechanical Engineering -FEM
State University at Campinas – UNICAMP/Brazil.

Summary

After a long period of steady growth, desktop commodity computer architecture has reached its ceiling on computing performance. Further progress is no longer enabled by growth in core clock rates, but by growth in parallelism. Many articles have been presented in the last editions of CILAMCE and MECOM on the use of multi-cored computing applied to a variety of problems. Furthermore, there is a growing trend toward parallel computation on the recently created general-purpose graphics hardware (GPGPU) [1]. Due to its architecture, the GPU is specially well-suited to address problems that can be expressed as data-parallel computations with high arithmetic intensity (the ratio of arithmetic operations to memory operations) [2]. Recent works have been shown astonishingly fast computations. For instance, papers on the use of GPGPU for computational mechanics have been reporting performances up to 100 times faster than CPUs for solution of linear systems, and around 900 times faster for numerical solution of infinite oscillatory integrals [3]. The first edition of this mini-symposium on CILAMCE 2009 has shown that the GPU has been investigated by researches of a very broad range of subjects in computational modeling with considerable gains in performance. The idea of the present mini-symposium is to gather researchers working on HPC tasks using GPGPU systems, aiming to discuss the state of the art issues, exchange experiences and solutions for existing implementation strategies and problems.

Suggested readings

[1] OWENS, J. D. et al., “A Survey of General-Purpose Computation on Graphics Hardware”, Computer Graphics, 26, 1 (2007), pp.  80-113.

[2] NVIDIA. “NVIDIA CUDA – Compute Unified Device Architecture – Programming Guide”. NVIDIA Corporation, Santa Clara (2008).

[3] MESQUITA, E.; LABAKI, J.; FERREIRA, L. O. S. “An Implementation of the Longman’s Integration Method on Graphics Hardware”. Computer Modeling in Engineering and Sciences, 51, 2 (2009), pp. 143-168.

CategoriasNoticia, acadêmico

Comparação GPU x sistemas paralelos

15 15UTC dezembro 15UTC 2009 Labaki Deixar um comentário

Monografia de conclusão de curso de A. V. Grammelsbacher e J. C. C. Medrado.

O trabalho visa fornecer um estudo comparando a execução de algoritmos paralelos na CPU e na GPU, elucidando se é mais vantajoso executar determinados algoritmos na CPU ou na GPU. Para realizar as comparações são feitos benchmarks da execução de algoritmos com a finalidade de medir a capacidade de processamento em FLOPS , a cópia de dados na memória entre outras características do sistema.

Comparacao de desempenho entre GPGPU e Sistemas Paralelos

Categoriasacadêmico, cookbook

Livro: “Numerical Recipes in C”

24 24UTC novembro 24UTC 2009 HIdagawa Deixar um comentário

O livro “Numerical Recipes in C” é um bom ponto de partida para se aprender sobre vários métodos numéricos, como resolução de sistemas lineares, maximização e minimização de funçoes, FFT e outros métodos. Cada capítulo do livro possui uma rápida explicação do método, seguido do seu respectivo código-fonte. Além disso, caso o leitor deseje se aprofundar mais em um determinado método, existem algumas referências bibliográficas no final de cada capítulo.

Neste link, encontra-se o índice do livro, onde é possível consultar os contéudos que o livro aborda.

Categoriasacadêmico

Sinopse do artigo: BEMxGPU

16 16UTC outubro 16UTC 2009 Labaki Deixar um comentário

Achei um artigo muito interessante,

Takahashi, T.; Hamada, T. (2009): “GPU-accelerated boundary element method for Helmhotz’ equation in three dimensions“.

Mesmo para quem conhece Elementos de Contorno, vale a pena ler o artigo. Aprendi várias coisas sobre GPU com ele, mesmo sem ter entendido muito a parte de Elementos de Contorno (apesar de ser minha área de pesquisa):

Peak performance

O artigo fala que “um processador escalar é capaz de executar 2 operações aritméticas por ciclo de clock. Nossa GPU tem 1.17 GHz e 12 multiprocessadores, num total de 96 processadores escalares. Portanto, a peak performance é de 228.1 Gflop/s”.

O “portanto é novo pra mim. Eu não sabia que era possível calcular a peak performance da máquina a partir desses dados… Como dá pra ver o clock da minha GPU no manual (1,296 GHz), e eu sei que ela tem 30 multiprocessadores, agora sei que a peak performance dela é 622.1 Gflop/s.

Fonte de citação

O artigo revê vários conceitos da programação CUDA e da tecnologia GPGPU. Isso é bom não só pra reforçar nosso know-how, mas também é sempre bom ter fontes adicionais pra citar nos nossos artigos. Frases de efeito que o artigo usa que talvez você queira citar:

  • Um warp tem mesmo 32, e não 16 threads;
  • O manual CUDA recomenda blocos com múltiplos de 64 threads para máxima performance;
  • A velocidade de floating-point operations throughput atual das GPUs é até 20 vezes maior que da CPU;
  • Programas de engenharia têm sido experimentados na GPU antes de CUDA, com OpenGL, DirectX, Cg e dispositivos dedicados.

Custo computacional

O artigo revisa o custo computacional de importantes métodos matemáticos. Por exemplo, ele fala que o custo computacional da solução direta de sistemas lineares (como escalonamentos, pivoteamentos, eliminação de Gauss) é da ordem de O(N3), e o consumo de memória é O(N2). Ele diz isso pra justificar a escolha de métodos iterativos no trabalho, como o gradiente conjugado, cujo custo computacional cai pra O(N2) e o consumo de memória cai pra O(N). Boa justificativa pro pessoal que mexe com gradiente conjugado & cia! O artigo ressalva, contudo, que o custo nesses métodos iterativos é proporcional ao número de iterações necessários para o método convergir, e que portanto um pré-condicionamento da matriz é sempre necessário para minimizar esse custo.

Em outro ponto no final do artigo, eles confirmam essa afirmação comparando um pré-condicionador (point-Jacobi), que permitiu convergência em 543 passos e 7498 s, com outro (block-diagonal) que convergiu em 446 passos em 9095 s (não, o resultado não está invertido). Essa diferença de 21% na eficiência justifica investir no estudo de pré-condicionadores.

E já que estamos falando de sistemas lineares: o artigo também alerta que sistemas lineares podem apresentar autovalores fictícios, que podem não só desacelerar a convergência do solver como degenerar os resultados. Há métodos para remover esses autovalores, como o de Burton-Miller, citado no trabalho.

Benchmark justo

Quando comparamos um código em GPU com CPU, os códigos têm que ser o mais parecidos possível para que a comparação seja justa. Para garantir que a comparação seja justa, o artigo faz uma coisa que eu nunca tinha visto: ele conta o número de operações que o algoritmo executa: quantas adições/subtrações, multiplicações, e uso de funções transcendentais. Aí é só garantir que CPU e GPU executem o mesmo número de operações, e a comparação terá sido justa. De quebra, aprendi que há uma forma de executar divisões implementada em hardware! É a função __fdividef(alfa,beta), que equivale a alfa/beta (eu só conhecia __sinf e __cosf).

Precisão mista

O artigo traz uma explicação bem detalhada sobre como fazer precisão mista, que serve para usar precisão dupla só quando for necessário ou para emular precisão dupla em GPUs que não têm esse recurso. Tem até um trecho de código explicando como fazer isso:

static __device__ __inline__ void dsacc0(float *ah, float *al, float b)

{

float t1 = *ah + b;

float e = t1 – *ah;

float t2 = ((b-e) + (*ah – (t1 – e))) + *al;

*ah = t1 + t2;

*al = t2 – (*ah – t1);

}

Todos sabemos que precisão dupla ainda é um ponto fraco das GPGPUs. A maioria só tem precisão simples, e nas que têm precisão dupla, o desempenho é dezenas de vezes inferior do que o da precisão simples. No entanto, precisão dupla, que é inútil em cálculos gráficos, é essencial em problemas de engenharia como o método dos elementos de contorno (assunto do artigo).

Threads por bloco

Na página 18, os autores contam em detalhes como fizeram para otimizar o número de threads por bloco.

  • Nthreads deve ser múltiplo de 64, de acordo com o manual do CUDA;
  • Cada bloco tem somente 16kb de memória compartilhada;
  • Os múltiplos de 64 que não excedem 16kb (neste problema) são: 64, 128, 192, 256 e 320;
  • Blocos com esses números de threads usariam respectivamente 1408, 2816, 4416, 5632 e 7360 registradores (neste problema). Como o número máximo de registradores é 8192, esse não é um parâmetro a se preocupar (neste problema);
  • Dois ou mais blocos são recomendados por multiprocessador, para compensar a carga de latência;
  • Como os blocos de 192, 256 e 320 threads resultariam em menos que isso, essas opções são descartadas;
  • 64 threads resultaria em 5 blocos por multiprocessador, mas o artigo afirma que a eficiência de caching de dados diminui com o tamanho do bloco;
  • Conclusão: o tamanho ótimo do bloco é 128 threads (de largura).

É interessante ler a discussão inteira. Dá várias idéias sobre como escolher o tamanho de bloco nos nossos próprios problemas.

Padrões de floats

Devido à imprecisão dos resultados da GPU, não é uma boa idéia usá-la na integração numérica de singularidades. Como essa integração é necessária no método dos elementos de contorno, os autores fizeram com que a parte singular das integrais fosse calculada pela CPU e a parte não-singular pela GPU. O resultado da integral era a soma dos resultados dos dois dispositivos. Aí a surpresa: GPUs não seguem a mesma especificação IEEE-754 sobre aritmética de ponto flutuante que as CPUs seguem! Assim, a partir de um dado número de elementos, a precisão do resultado da integral “quebrava”, isto é, a integral não melhorava se o integrador fosse refinado.

Observe como a GPU em precisão simples perde precisão mesmo com o aumento do refinamento.

Observe como a GPU em precisão simples perde precisão mesmo com o aumento do refinamento.

Isso parece ter sido tão frustrante que os autores desistiram de usar precisão simples a partir daí (apesar dela ser incrivelmente mais rápida na GPU).

Limite da GPU

Meus programas sempre têm um limite de tamanho de dados que eu posso usar, mas nunca investiguei isso a fundo. No fim, não sei a razão desse limite. Nesse artigo, um gráfico pouco usual é plotado. No eixo y, em vez de milissegundos, são mostrados Gflop/s.

Figura 5: Performance da GPU em tempo total versus tempo de kernel.

Figura 5: Performance da GPU em tempo total versus tempo de kernel.

Como a porcentagem de capacidade de computação do kernel vai sempre se aproximando da do programa completo e o total tende a uma assíntota (claro, a GPU tem uma peak performance), os autores concluíram que o programa deles era limitado pela aritmética, e não pela largura de banda de memória.

Boa leitura!

Categoriasacadêmico

Abrindo a caixa-preta das GPUs NVIDIA

16 16UTC outubro 16UTC 2009 losferreira Deixar um comentário

Vasily Volkov e James W. Demmel deram uma importante contribuição às técnicas de programação de GPUs NVIDIA das séries 8, 9 e 200, no artigo intitulado “Benchmarking GPUs to Tune Dense Linear Algebra”. Usaram as ferramentas de software concebidas por Wladimir J. van der Laan (um Assembler e um Desassembler) para ter acesso ao código em linguagem Assembly das GPUs, que não é informado pela NVIDIA, e assim entender melhor a arquitetura do hardware para obter o máximo desempenho. É leitura indispensável para quem quer extrair até o último FLOPS da sua GPU.

CategoriasNoticia, acadêmico

Curso CUDA

8 08UTC outubro 08UTC 2009 Labaki Deixar um comentário

Curso de CUDA no Simulation-Based Engineering Laboratory. Contém os slides e áudio do curso, além de exercícios, projetos da turma, e uma excelente introdução sobre colisão/detecção de corpos.

Sugestão do Luís Ramirez para a lista GPUBrasil.

Categoriasacadêmico, tutorial