Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás [email protected] 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 – Lista de NVIDIA GPU’S Modelo Processadores Clock Mem. Clock GForce 8400 GS 16 450 MHz 400 MHz GForce 8800 GT 96 550 MHz 800 MHz GForce 9600 GT 64 1,2 GHz 750 MHz GForce 9800 GT 112 1,5 GHz 900 MHz Tesla C1060 240 1,3 GHz 800 MHz Tesla S1070 960 1,44 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. Arquitetura – CUDA SDK 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áticas sinf, powf, atanf, ceil, etc • Tipos primitivos float4, 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ção kernel_cod<<<4,4>>>(...); • Variáveis globais gridDim = 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ória cudaMalloc(); // Alocação de memória cudaFree(); // Desalocação de memória cudaMemcpy(); // Copia memória CUDA – Tipos de Memória • Memória Local Local a thread, acesso de leitura/escrita • Memória Compartilhada Local ao bloco, acesso de leitura/escrita • Memória Global Todas as threads mais o host, leitura/escrita • Memória Constante Todas 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 CUDA – Exemplo de Código 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 Aplicações – Casos reais 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. Lucas Universidade Católica de Goiás [email protected]