Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade...

27
Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás [email protected]

Transcript of Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade...

Page 1: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Divino César S. LucasUniversidade Católica de Goiás

[email protected]

Page 2: 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]

• Exemplo de Código [11:40 até 11:50]

• Futuro [11:50 até 12:00]

• Dúvidas [12:00 até ~]

Page 3: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Introdução – Modelos de Programação

• SISD (Single instruction single data)• Fluxo sequêncial de instruções e dados

Page 4: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Introdução – Modelos de Programação

• SIMD (Single Instruction Multiple Data)• A mesma instrução com dados diferentes

Page 5: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Introdução – Modelos de Programação

• MISD (Multiple Instruction Single Data)• Multiplas instruções para o mesmo dado

Page 6: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Introdução – Modelos de Programação

• MIMD (Multiple Instruction Multiple Data)• Multiplas instruções e multiplos dados

Page 7: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 8: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Introdução – Comparando a Performance

• Gráfico comparativo com CPU 3.0 GHZ

Page 9: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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 -

Page 10: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Introdução – Diferenças entre GPU e CPU

• Quantidade de processadores• Velocidade de acesso a memória• Arquitetura projetada para paralelismo

Page 11: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 12: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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.

Page 13: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Arquitetura – CUDA SDK

Page 14: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

CUDA – O que é?

• CUDA – (Computing Unified Device Architecture)• Extensão para a linguagem C, Python, Java, Fortran ...

Page 15: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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.

Page 16: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 17: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 18: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 19: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 20: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

CUDA – Exemplo de Código

Page 21: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 22: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Aplicações – Casos reais

Page 23: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 24: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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

Page 25: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

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.

Page 26: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Futuro – Integração CPU e GPU

• Como será o processador no futuro?

Page 27: Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás divcesar@gmail.com.

Obrigado pela atenção!

Dúvidas?

Divino César S. LucasUniversidade Católica de Goiás

[email protected]