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

Post on 21-Apr-2015

104 views 0 download

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

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

Divino César S. LucasUniversidade 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é ~]

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

divcesar@gmail.com