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]

Upload: internet

Post on 21-Apr-2015

106 views

Category:

Documents


0 download

TRANSCRIPT

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]