computação de alto desempenho utilizando placas gráficas divino césar s. lucas universidade...
TRANSCRIPT
Computação de Alto Desempenho Utilizando Placas Gráficas
Divino César S. LucasUniversidade Católica de Goiás
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á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
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
__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];
}
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 KernelincrementArrayOnDevice <<< nBlocks, blockSize >>> (a, b, c, N);
KERNEL
HOST
Exemplo – Multiplicar Vetor com pyCUDA
mod = drv.SourceModule(""" __global__ void multiply_them(float *dest, float *a, float *b) {
const int i = threadIdx.x; dest[i] = a[i] * b[i];
} """)
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))
KERNEL
HOST
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ás