270 likes | 411 Views
Computação de Alto Desempenho Utilizando Placas Gráficas. Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com. Crônograma. Introdução [10:30 até 11:00] Arquitetura [11:00 até 11:15] O que é CUDA? [11:15 até 11:30] Aplicações [11:30 até 11:40]
E N D
Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. LucasUniversidade Católica de Goiásdivcesar@gmail.com
Crônograma • Introdução [10:30 até 11:00] • Arquitetura [11:00 até 11:15] • O que é CUDA? [11:15 até 11:30] • Aplicações [11:30 até 11:40] • Exemplo de Código [11:40 até 11:50] • Futuro [11:50 até 12:00] • Dúvidas [12:00 até ~]
Introdução – Modelos de Programação • SISD (Single instruction single data) • Fluxo sequêncial de instruções e dados
Introdução – Modelos de Programação • SIMD (Single Instruction Multiple Data) • A mesma instrução com dados diferentes
Introdução – Modelos de Programação • MISD (Multiple Instruction Single Data) • Multiplas instruções para o mesmo dado
Introdução – Modelos de Programação • MIMD (Multiple Instruction Multiple Data) • Multiplas instruções e multiplos dados
Introdução – Porquê GPU? • Baixo Custo • Alto Desempenho • Relativamente fácil de ser programada • Programas são portáveis • Escalável • Possibilita programação “heterogênea” • Relação Custo/Beneficio extremamente alta
Introdução – Comparando a Performance • Gráfico comparativo com CPU 3.0 GHZ
Introdução – Diferenças entre GPU e CPU • Quantidade de processadores • Velocidade de acesso a memória • Arquitetura projetada para paralelismo
Introdução – Benefícios da Prog. Paralela • Um pesquisador um supercomputador • Possibilidade de resolver problemas maiores • Solução para os problemas de arquitetura • Possibilita aplicações, mais realistas • Desenvolvimento acelerado da computação científica
Arquitetura – Hierarquia de Memória • Memória local por thread • Memória compartilhada no bloco • Memória constante por grid • Memória global por grid • Essa hierarquia foi projetada para permitir compartilhamento de tarefas entre as threads e reduzir acesso a memória externa.
CUDA – O que é? • CUDA – (Computing Unified Device Architecture) • Extensão para a linguagem C, Python, Java, Fortran ...
CUDA – O Básico • Device = GPU = conjunto de multiprocessadores • Host = CPU • Multiprocessador = Conjunto de processadores • Kernel = Programa executável na GPU • Grid = Array de threads que executam um Kernel • Bloco de Thread = Grupo de threads executando no modelo SIMD.
CUDA – Visão Geral • Funções Matemáticassinf, powf, atanf, ceil, etc • Tipos primitivosfloat4, int4, unit4, etc • Modificadores de funções__global__ // chamada via host __device__ // chamada via kernel __host__ // chamada e executa no host • Modificadores de variáveis__constant__ // memória constante __device__ // no device, memória global __shared__ // compartilhada
CUDA – Visão Geral • Configuração de execuçãokernel_cod<<<4,4>>>(...); • Variáveis globaisgridDim = Tamanho do grid blockDim = Tamanho do bloco blockIdx = Índice do bloco no grid threadIdx = Índice da thread no bloco • Funções globais__syncthreads(); • Gerenciamento de memóriacudaMalloc(); // Alocação de memóriacudaFree(); // Desalocação de memóriacudaMemcpy(); // Copia memória
CUDA – Tipos de Memória • Memória LocalLocal a thread, acesso de leitura/escrita • Memória CompartilhadaLocal ao bloco, acesso de leitura/escrita • Memória GlobalTodas as threads mais o host, leitura/escrita • Memória ConstanteTodas as threads mais o host, apenas leitura
CUDA – Extensões e Bibliotecas • pyCUDA – CUDA for Python • jaCUDA – CUDA for Java • CuBLAS – Utilizada para Álgebra Linear • CuFFT – Transformações de Fourier • jCublas – Java para Álgebra Linear
Aplicações – Nicho de desenvolvimento • Uso intensivo de cálculos • Algebra Linear • Física • Uso de largura de banda • Mercado Financeiro • Dados Genômicos • Banco de Dados • Computação Visual • Processamento de Imagens • Tomográfia • Visão de Máquina
Exemplo – Somar Vetores em C KERNEL __global__ void incrementArrayOnDevice(float *a, float *b, float *c, int N) { int idx = blockIdx.x*blockDim.x + threadIdx.x; if (idx<N) c[idx] = a[idx] + a[idx]; } HOST void incrementArrayOnHost(float *a, float *b, float *c, int N) { int i; for (i=0; i < N; i++) c[i] = a[i] + b[i]; } // Chamada do Kernel incrementArrayOnDevice <<< nBlocks, blockSize >>> (a, b, c, N);
Exemplo – Multiplicar Vetor com pyCUDA KERNEL mod = drv.SourceModule(""" __global__ void multiply_them(float *dest, float *a, float *b) { const int i = threadIdx.x; dest[i] = a[i] * b[i]; } """) HOST multiply_them = mod.get_function("multiply_them") a = numpy.random.randn(400).astype(numpy.float32) b = numpy.random.randn(400).astype(numpy.float32) dest = numpy.zeros_like(a) multiply_them(drv.Out(dest), drv.In(a), drv.In(b), block=(400,1,1))
Futuro – Supercomputador pessoal Tesla • Primeiro computador do mundo com vários núcleos na faixa de teraflops. • 960 núcleos. Processamento de alto paralelismo. • 250 vezes a performance de computação de um PC.
Futuro – Integração CPU e GPU • Como será o processador no futuro?
Obrigado pela atenção!Dúvidas?Divino César S. LucasUniversidade Católica de Goiásdivcesar@gmail.com