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]
Download

Computação de Alto Desempenho Utilizando Placas Gráficas