A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

GPGPU. GPU GPU – Quebra de paradigma radical Você mudaria todo o teu paradigma de desenvolvimento e hardware apenas para ganhar 5% de desempenho?

Apresentações semelhantes


Apresentação em tema: "GPGPU. GPU GPU – Quebra de paradigma radical Você mudaria todo o teu paradigma de desenvolvimento e hardware apenas para ganhar 5% de desempenho?"— Transcrição da apresentação:

1 GPGPU

2 GPU

3 GPU – Quebra de paradigma radical Você mudaria todo o teu paradigma de desenvolvimento e hardware apenas para ganhar 5% de desempenho?

4 GPGPU – a evolução... Há 3 fases históricas das GPUs: -Fixed Function GPU - Programmable GPU - Arquitetura Unificada

5 Fixed Function GPUs -Arquitetura incapaz de aceitar programação -Impossível realizar cálculos sem ser de computação gráfica -Incapacidade de acesso ao processador - Conceito de APIs

6 Fixed Function GPUs Interface CPU - GPU CPU Interface GPU - Video Engine de Geometria Engines de Rasterização Front Buffer Back Buffers Z Buffer Stencil Buffer Texture Buffer MemóriaMemória devídeodevídeo Processador(es) Back Buffer Front Buffer

7 Programmable GPU - Vertex and Pixel Shaders - Arquitetura orientada a estrutura de dados de computação gráfica

8 Programmable GPU

9

10 Arquitetura Unificada - CUDA

11 Programmable GPU -Limitações: -Shaders -Modo de endereçamento limitado -Pequeno grupo de instruções -Dificuldade de comunicação entre processadores e processos

12 GPGPU - Problema de ter que mapear tudo para APIs - Usar funções OpenGL ou DirectX para efetuar todo tipo de operações

13 Arquitetura Unificada - CUDA

14 Paralelismo sem esforço, baixo custo...

15 Por que mais rápido? Tarefa 100 vezes mais rápido Tarefa de 1 ano de duração cai para 3 dias Tarefa de 1 dia cai para 15 minutos Tarefa de 3 segundos cai para 30 vezes por segundo

16 Exemplo: Simulação de Multidão

17 GPU Operações aritiméticas ++ Operações de memória --

18 Threads Porque programar em Threads? -Para fazer distribuição de carga em arquitetura single core - Para fazer distribuição de carga entre múltiplos núcleos - Desafio de ter que manter o máximo de uso de cada núcleo

19 Threads Quantas threads voce já criou para seu programa?

20 Threads -CUDA permite até 12 mil threads - CUDA é basicamente um cluster de threads

21 Threads – Custo de gerenciamento Em CPU, como fazemos pouca troca de threads, podemos achar natural gastar 1000 instruções para fazer a troca de uma thread para outra. Em CUDA há outro paradigma.... Não é necessário gerenciar as threads, a priori. Sincronismo deve ser explicito

22 Modelo de Programação CUDA estende a linguagem C através de kernels Kernels equivalem a funções, que serão executadas N vezes em paralelo N é o número de threads

23 Arquitetura do Software

24 Funções em CUDA -Não pode haver recursão no __device__ -Sem variáveis estáticas -Sem numero variável de parâmetros -A chamada do kernel é assíncrona -Sincronismo deve ser feito explicitamente - __device__ __host__ : podem ser usados juntos

25 Limite de banda de memória Importância do reuso de dados

26 Threads, Blocos e Grids Um kernel corresponde a um grid de Blocos Cada Bloco é composto por threads Todas as threads compartilham a mesma área de memória As threads de um mesmo bloco podem compartilhar umas com as outras Threads de blocos diferentes não podem compartilhar memória entre si

27 Threads, Blocos e Grids - memórias

28 Palavras reservadas

29 Hierarquia de Threads Todos os threads de um bloco usam da mesma memória compartilhada. O número de threads num bloco é limitado pela memória: GPUs atuais possuem até 512 threads.

30 Funções em CUDA __ global__ void KernelFunction (...) dim3 DimGrid (100, 10); // Grid com 1000 blocos dim3 DimBlock (4, 8, 8); // Cada bloco tem 256 threads Size_t SharedMemBytes = 32 KernelFun > (...);

31 Kernel – será compilado para a GPU // Kernel definition __global__ void vecAdd(float* A, float* B, float* C) { } int main() { // Kernel invocation vecAdd >>(A, B, C); } __global define que é um kernel

32 kernel __global__ void vecAdd(float* A, float* B, float* C) { int i = threadIdx.x; C[i] = A[i] + B[i]; } int main() { vecAdd >>(A, B, C); } threadIdx define um ID de um dos threads > numero de blocos (n) e threads (m) solicitados para o kernel

33 Hierarquia de Threads threadIdx é um vetor de 3 componentes Threads podem ser identificados com índices de 1, 2 ou 3 dimensões (formando thread blocks de uma, duas ou três dimensões) Índice de uma thread: -Se for um bloco 1D: é a mesma coisa -Se for um bloco 2D (D x, D y ): threadId de um thread de índice (x, y) é x + yD x -Se for um bloco 3D (D x, D y, D z ): threadId de uma thread de índice (x, y, z) é x + yD x + zD x D y

34 Primeiro exemplo de programa cudaMalloc aloca espaço de memória global da GPU

35 Primeiro exemplo de programa

36 kernel Como faria para somar uma Matriz?

37 As GPUs vão desaparecer...


Carregar ppt "GPGPU. GPU GPU – Quebra de paradigma radical Você mudaria todo o teu paradigma de desenvolvimento e hardware apenas para ganhar 5% de desempenho?"

Apresentações semelhantes


Anúncios Google