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

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

Tópicos sobre GPGPU em CUDA Paulo A. Pagliosa Faculdade de Computação Universidade Federal de Mato Grosso do Sul Natal, maio de.

Apresentações semelhantes


Apresentação em tema: "Tópicos sobre GPGPU em CUDA Paulo A. Pagliosa Faculdade de Computação Universidade Federal de Mato Grosso do Sul Natal, maio de."— Transcrição da apresentação:

1 Tópicos sobre GPGPU em CUDA Paulo A. Pagliosa Faculdade de Computação Universidade Federal de Mato Grosso do Sul Natal, maio de 2013

2 Apresentação Conteúdo – Introdução a GPGPU (www.gpgpu.org) – O que é CUDA – Fundamentos de programação CUDA – Práticas de programação – APIs e ferramentas – Estudo de caso 2

3 Introdução a GPGPU GPUs: unidades de processamento gráfico – Originalmente projetadas para processamento gráfico 3D – Exemplos 3 NVIDIA GeForce 8800 GTX NVIDIA Tesla C1060

4 Introdução a GPGPU Pipeline gráfico fixo (OpenGL) 4 HardwareSoftware Aplicação Processamento de geometria Exibição Processamento de fragmentos Cena Dados de geometria Dados de pixels Fontes de luz Materiais Rasterização Framebuffer

5 Hardware Exibição Rasterização Framebuffer Introdução a GPGPU Pipeline gráfico fixo (OpenGL) 5 Processamento de geometria Processamento de fragmentos Transformação Iluminação Projeção Montagem de primitivos Recorte Primitivos

6 Hardware Exibição Framebuffer Rasterização Processamento de geometria Processamento de fragmentos Introdução a GPGPU Pipeline gráfico fixo (OpenGL) 6

7 Mapeamento de textura Aplicação de neblina Composição Tonalização Hardware Exibição Framebuffer Rasterização Processamento de geometria Processamento de fragmentos Introdução a GPGPU Pipeline gráfico fixo (OpenGL) 7

8 Introdução a GPGPU GPUs de primeira geração (1998) – Pipeline fixo – Renderização de triângulos pré-transformados – Exemplos: TNT2, Voodoo3 GPUs de segunda geração ( ) – Transformações geométricas – Iluminação – Velocidade de renderização maior – Exemplos: GeForce 2, ATI

9 Hardware Exibição Framebuffer Rasterização Processamento de geometria Processamento de fragmentos Introdução a GPGPU Pipeline gráfico programável (OpenGL 3.1) 9 Transformação Iluminação Projeção Montagem de primitivos Recorte Primitivos

10 Mapeamento de textura Aplicação de neblina Composição Tonalização Hardware Exibição Framebuffer Rasterização Processamento de geometria Processamento de fragmentos Introdução a GPGPU Pipeline gráfico programável (OpenGL 3.1) 10

11 Introdução a GPGPU Shaders – Módulos que executam em GPU – Um shader pode ser de: Vértice Geometria (SM 4) Fragmento – Substituem a funcionalidade do pipeline fixo Programa em GPU: um ou mais shaders 11 Programa GPU Shader de vértice Shader de geometria Shader de fragmento

12 Introdução a GPGPU Shader de fragmento – Opera isoladamente sobre um fragmento – Entrada Variáveis pré-calculadas pela OpenGL Variáveis definidas pela aplicação – Saída: cor do fragmento – Operações Mapeamento de textura Tonalização Aplicação de neblina – Fragmento pode ser descartado – Coordenadas do fragmento não podem ser mudadas 12

13 Introdução a GPGPU GPUs de terceira geração ( ) – Pipeline programável com shaders de vértices – Número limitado de instruções sem ponto flutuante – Programação em linguagem de montagem – Exemplos: GeForce3 e 4, ATI 8500 GPUs de quarta geração ( ) – Shaders de vértices e fragmentos – Expansão do número de instruções – Ponto flutuante de 32 bits e dados em texturas – Surgimento de linguagens de shaders – Exemplos: GeForce FX, 6 e 7; ATI 9700 e

14 Introdução a GPGPU 14 NVIDIA GeForce 6800 – Até 6 processadores de vértices – 16 processadores de fragmentos

15 Introdução a GPGPU Linguagens de shaders – Cg (C for graphics), NVIDIA – HLSL (High Level Shader Language), Microsoft – GLSL (OpenGL Shader Language) 15

16 Introdução a GPGPU Programas GLSL 16 Programa glCreateProgram glAttachShader glLinkProgram glUseProgram Shader glCreateShader glShaderSource glCompileShader Código GLSL

17 Introdução a GPGPU GPGPU: programação genérica em GPU GPGPU com shaders – Modelo de programação: streams e kernels – Streams: dados de entrada e saída Vetores em CPU texturas em GPU – Kernels: shaders (de fragmento) – Saída: renderização em textura – Execução: rasterização – Mapping Computational Concepts to GPUs (GPU Gems 2) – Dificuldades 17

18 Introdução a GPGPU Exemplos – Simulação dinâmica de corpos rígidos – Multiplicação de matrizes potência de dois 18 Sem restrições Com detecção de colisões

19 Introdução a GPGPU Desvantagens de GPGPU com shaders – GPU é programada através de uma API gráfica Curva de aprendizado da API Overhead para aplicações não gráficas – Flexibilidade Memória da GPU pode ser lida (gather) mas não pode ser escrita (scatter) de maneira geral Shader de fragmento produz apenas saídas RGBA CUDA: Compute Unified Device Architecture GPUs de quinta geração (2007-) – Computação de propósito geral – Exemplos: GeForce 8, 9, 100 e

20 Introdução a GPGPU 20 NVIDIA GeForce 8800 GTX – 16 multiprocessadores (SMs) – 8 processadores (SPs) por multiprocessador

21 Introdução a GPGPU Aplicações CUDA – Visualização e simulação – 21 Traçado de raios Simulação de fluídos

22 Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU 22

23 Introdução a GPGPU Por que CUDA? – Desempenho versus custo – NVIDIA é líder de mercado: mais de 10 8 GPUs – Programação paralela para muitos – Tesla, Fermi e Kepler Instalação de CUDA 1.Driver 2.CUDA toolkit (compilador e bibliotecas) 3.CUDA SDK (utilitários e exemplos) https://developer.nvidia.com/cuda-downloads 23

24 Introdução a GPGPU Bibliografia (http://docs.nvidia.com/cuda/index.html) – CUDA Programming Guide – CUDA Reference Manual – CUDA Best Practices Guide 24

25 Fundamentos de programação CUDA Modelo de programação – Host: executa a aplicação (CPU) – Dispositivo (GPU) Coprocessador da CPU Executa kernels – Host e dispositivo tem DRAMs próprias – Host: Aloca memória no dispositivo Transfere dados de entrada para o dispositivo Dispara a execução de kernels Transfere dados resultantes do dispositivo Libera memória no dispositivo 25

26 Fundamentos de programação CUDA Modelo de programação – Kernel Função geralmente escrita em C para CUDA Executa no dispositivo N vezes em N threads em paralelo – Threads são organizadas em blocos – Um bloco é um arranjo 1D, 2D ou 3D de threads Cada thread de um bloco tem um índice 1D, 2D ou 3D – Blocos são organizados em grids – Um grid é um arranjo 1D ou 2D de blocos Cada bloco de um grid tem um índice 1D ou 2D Os blocos de um grid têm o mesmo número de threads 26

27 Fundamentos de programação CUDA Exemplo: kernel executando em 72 threads – Grid 2D com: Dimensão 3×2×1 6 blocos – Blocos 2D com: Dimensão 4×3×1 12 threads cada 27

28 Fundamentos de programação CUDA Modelo de programação – Um kernel é uma função que: Começa com o especificador __global__ Tem tipo de retorno void – Kernels podem invocar outras funções que: São especificadas como __device__ Podem invocar outras especificadas como __device__ (GPUs Kepler podem invocar kernels) – Funções que executam no dispositivo: Não admitem número variável de argumentos Não admitem variáveis estáticas GPUs não Fermi não admitem recursão nem variáveis do tipo endereço de função 28

29 Fundamentos de programação CUDA Modelo de programação – Kernels são invocados do host (ou de Kepler) – Um dispositivo executa um kernel de cada vez (Fermi pode mais) 29

30 Fundamentos de programação CUDA Modelo de programação – Configuração de execução de um kernel Dimensões do grid e dos blocos Tamanho da memória compartilhada (opcional) Especificada na invocação (ou lançamento) do kernel – Dimensão 3D é representada por objeto do tipo dim3 – Um grid: 1D de dimensão dim3 dG tem dG.x × 1 × 1 blocos 2D de dimensão dim3 dG tem dG.x × dG.y × 1 blocos – Um bloco: 1D de dimensão dim3 dB tem dB.x × 1 × 1 threads 2D de dimensão dim3 dB tem dB.x × dB.y × 1 threads 3D de dimensão dim3 dB tem dB.x × dB.y × dB.z threads 30

31 Fundamentos de programação CUDA Modelo de programação – Identificador global de uma thread – Pode ser usado para indexar vetores e matrizes em funções __global__ ou __device__ – Determinado a partir das variáveis pré-definidas: dim3 gridDim – Dimensão do grid dim3 blockDim – Dimensão do bloco dim3 blockIdx – Índice do bloco no grid dim3 threadIdx – Índice da thread no bloco 31

32 Fundamentos de programação CUDA 32 Modelo de programação – Hierarquia de memória acessada por uma thread Memória compartilhada do bloco da thread – Visível para todas as threads do bloco – Tempo de vida do bloco Memória local da thread Memória global Memória constante Memória de textura Somente leitura Tempo de vida da aplicação

33 Fundamentos de programação CUDA Modelo de programação – Capacidade de computação 1.x (Tesla) 2.x (Fermi) 3.x (Kepler) – Especificações: depende do dispositivo Número de multiprocessadores e processadores Dimensões de grids e blocos DRAM Memória compartilhada, etc. 33

34 Fundamentos de programação CUDA Interface de programação – C para CUDA e API de runtime – API de driver – Ambas APIs têm funções para: Gerência de memória no dispositivo Transferência de dados entre host e dispositivo Gerência de sistemas com vários dispositivos, etc. – API de runtime tem também funções para: Gerenciamento de threads Detecção de erros – Manual de referência de CUDA 34 APIs exclusivas

35 Fundamentos de programação CUDA Programa básico em C para CUDA – Seleção do dispositivo a ser usado – Alocação de memória no host – Dados de entrada na memória do host – Alocação de memória no dispositivo – Transferência de dados do host para dispositivo – Invocação do(s) kernel(s) – Transferência de dados do dispositivo para host – Liberação de memória no host – Liberação de memória no dispositivo – Finalização 35

36 Fundamentos de programação CUDA Programa básico em C para CUDA – Seleção do dispositivo a ser usado cudaSetDevice() – Alocação de memória no dispositivo cudaMalloc() – Transferência de dados entre host e dispositivo cudaMemcpy() – Liberação de memória no dispositivo cudaFree() – Finalização cudaDeviceReset() 36

37 Fundamentos de programação CUDA 37 Exemplo: multiplicação de matrizes – Sem memória compartilhada

38 Fundamentos de programação CUDA Memória compartilhada – Disponível para threads de um mesmo bloco – Acesso 400 a 600 mais rápido que memória global – Permite colaboração entre threads (do bloco) Cada thread do bloco transfere dados da memória global para memória compartilhada Após a transferência, threads devem ser sincronizadas com __syncthreads() Kernel efetua operações usando os dados da memória compartilhada: cada thread pode usar dados carregados por outras threads do bloco Se necessário, threads podem ser sincronizadas com __syncthreads() ; cada thread do bloco transfere dados da memória compartilhada para memória global 38

39 Fundamentos de programação CUDA 39 Exemplo: multiplicação de matrizes – Com memória compartilhada

40 Fundamentos de programação CUDA Exemplo: transposição de matrizes 40 __ syncthreads() Mem. compartilhada

41 Fundamentos de programação CUDA Exemplo: transposição de matrizes 41 Mem. compartilhada

42 Fundamentos de programação CUDA 42 Implementação em hardware – Arquitetura: arranjo de multiprocessadores (SMs) – Cada SM consiste de: 8 processadores (SPs) 1 unidade de instrução Memória compartilhada – Cada SM: Executa threads de um bloco em grupos de 32: warp Implementa barreira de sincronização: __ syncthreads() Emprega arquitetura SIMT: Single Instruction Multiple Thread

43 Dicas de performance 43 Estratégias básicas – Maximização da execução em paralelo Estruturação do algoritmo Escolha da configuração de execução do kernel – Número de threads por bloco múltiplo do tamanho do warp – Mínimo de 64 threads por bloco – Configuração inicial: entre 128 e 256 threads por bloco Evitar divergência dentro do mesmo warp – Otimização do uso de memória Minimização de transferência de dados host/dispositivo Acesso coalescido à memória global Uso de mem. compartilhada Acesso sem conflitos de bancos à mem. compartilhada – Otimização do uso de instruções

44 Dicas de performance 44 Memória global – O dispositivo é capaz de ler palavras de 4, 8 ou 16 bytes da memória global para registradores com UMA única instrução, DESDE que o endereço de leitura seja alinhado a (múltiplo de) 4, 8, ou 16. – A largura de banda da memória global é mais eficientemente usada quando acessos simultâneos à memória por threads de um meio- warp (durante a execução de uma instrução de leitura ou escrita) podem ser coalescidos em uma única transação de 32, 64 ou 128 bytes de memória.

45 Dicas de performance 45 Memória global – Coalescência em dispositivos 1.0 e 1.1 Ocorre em transação de 64 ou 128 ou duas transações de 128 bytes Threads de um meio-warp devem acessar: – Palavras de 4 bytes, resultando numa transação de 64 bytes, – Ou palavras de 8 bytes, resultando numa transação de 128 bytes, – Ou palavras de 16 bytes, resultando em duas transações de 128 bytes Todas as 16 palavras (cada uma acessada por uma das 16 threads do meio-warp) devem estar no mesmo segmento de tamanho igual ao tamanho das transações (ou seja, 64, 128 ou 256 bytes). Como consequência, o segmento deve ser alinhado a este tamanho Threads devem acessar palavras na sequência: a thread k deve acessar a palavra k

46 Dicas de performance Memória global – Com coalescência 46

47 Dicas de performance 47 Memória global – Sem coalescência

48 Dicas de performance 48 Memória global – Sem coalescência

49 Dicas de performance 49 Memória global – Coalescência com vetor de estruturas (AOS) Tamanho da estrutura até 16 bytes – Alinhamento deve ser 4, 8 ou 16 bytes, dependendo do tamanho – Elementos devem estar no mesmo segmento da transação Estruturas maiores que 16 bytes: reorganizar em estrutura de vetores (SOA) com elementos de tamanho até 16 bytes

50 Dicas de performance 50 Memória compartilhada – Dividida em módulos chamados bancos Em dispositivos 1.x o número de bancos é 16 Bancos tem largura de 32 bits – Palavras sucessivas de 32 bits estão em bancos sucessivos – Acessos a n endereços que estão em n bancos distintos são efetuados simultaneamente – Acessos a dois endereços que estão no mesmo banco geram um conflito de banco: acessos são serializados – Threads de um meio-warp devem acessar endereços em bancos distintos para evitar conflitos de bancos

51 Dicas de performance 51 Mem. compartilhada – Sem conflitos

52 Dicas de performance Mem. compartilhada – Com conflitos 52

53 APIs para CUDA CUBLAS CUFFT Primitivos paralelos: Thrust (CUDA 5.0) – Algoritmos Soma prefixa Redução Compactação Ordenação – Exemplos no SDK CUDA Scan Partículas Etc. 53

54 Primitivos paralelos Soma prefixa (scan) – Entrada Sequência A de n elementos de um tipo T Operador binário associativo op com identidade I – Saída: s equência B de n elementos do tipo T – Exemplo: T = int, op = +, I = Entrada A Saída B Soma prefixa exclusiva 36

55 Primitivos paralelos Soma prefixa (scan) – Entrada Sequência de n elementos de um tipo T Operador binário associativo op com identidade I – Saída: s equência de n elementos do tipo T – Exemplo: T = int, op = +, I = Entrada A Saída B Soma prefixa inclusiva

56 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva intra-warp (warp de 8 threads) data __device__ int scanWarp(int* data, int tidx, int lane) { if (lane >= 1) data[tidx] = data[tidx-1] + data[tidx]; if (lane >= 2) data[tidx] = data[tidx-2] + data[tidx]; if (lane >= 4) data[tidx] = data[tidx-4] + data[tidx]; return data[tidx]; }

57 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva intra-warp (warp de 8 threads) data __device__ int scanWarp(int* data, int tidx, int lane) { if (lane >= 1) data[tidx] = data[tidx-1] + data[tidx]; if (lane >= 2) data[tidx] = data[tidx-2] + data[tidx]; if (lane >= 4) data[tidx] = data[tidx-4] + data[tidx]; return data[tidx]; }

58 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva intra-warp (warp de 8 threads) data __device__ int scanWarp(int* data, int tidx, int lane) { if (lane >= 1) data[tidx] = data[tidx-1] + data[tidx]; if (lane >= 2) data[tidx] = data[tidx-2] + data[tidx]; if (lane >= 4) data[tidx] = data[tidx-4] + data[tidx]; return data[tidx]; }

59 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva intra-bloco (warp de 4 threads) 59 data __device__ int scanBlock(int* data, int tidx, int lane, int warp) { int val = scanWarp(data, tidx, lane); __syncthreads(); if (lane == 3) data[warp] = data[tidx]; __syncthreads(); if (warp == 0) scanWarp(data, tidx, lane); __syncthreads(); if (warp > 0) val = data[warp-1] + val; __syncthreads(); data[tidx] = val; __syncthreads(); return val; }

60 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva intra-bloco (warp de 4 threads) 60 data __device__ int scanBlock(int* data, int tidx, int lane, int warp) { int val = scanWarp(data, tidx, lane); __syncthreads(); if (lane == 3) data[warp] = data[tidx]; __syncthreads(); if (warp == 0) scanWarp(data, tidx, lane); __syncthreads(); if (warp > 0) val = data[warp-1] + val; __syncthreads(); data[tidx] = val; __syncthreads(); return val; }

61 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva intra-bloco (warp de 4 threads) 61 data __device__ int scanBlock(int* data, int tidx, int lane, int warp) { int val = scanWarp(data, tidx, lane); __syncthreads(); if (lane == 3) data[warp] = data[tidx]; __syncthreads(); if (warp == 0) scanWarp(data, tidx, lane); __syncthreads(); if (warp > 0) val = data[warp-1] + val; __syncthreads(); data[tidx] = val; __syncthreads(); return val; }

62 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva intra-bloco (warp de 4 threads) 62 data __device__ int scanBlock(int* data, int tidx, int lane, int warp) { int val = scanWarp(data, tidx, lane); __syncthreads(); if (lane == 3) data[warp] = data[tidx]; __syncthreads(); if (warp == 0) scanWarp(data, tidx, lane); __syncthreads(); if (warp > 0) val = data[warp-1] + val; __syncthreads(); data[tidx] = val; __syncthreads(); return val; } val

63 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva intra-bloco (warp de 4 threads) 63 data __device__ int scanBlock(int* data, int tidx, int lane, int warp) { int val = scanWarp(data, tidx, lane); __syncthreads(); if (lane == 3) data[warp] = data[tidx]; __syncthreads(); if (warp == 0) scanWarp(data, tidx, lane); __syncthreads(); if (warp > 0) val = data[warp-1] + val; __syncthreads(); data[tidx] = val; __syncthreads(); return val; } val

64 Primitivos paralelos Implementação da soma prefixa – Soma prefixa inclusiva global (exercício) 1.Faça a soma prefixa de todos os blocos com scanBlock(). 2.Armazene o resultado de cada bloco i em blockResults[i]. 3.Faça a soma prefixa de blockResults[i]. 4.Cada thread do bloco i adiciona elemento i do passo 3 a seu elemento de saída do passo 1. Passos 1 + 2, 3 e 4 requerem três invocações de kernels. Passo 3 pode requerer invocações repetidas da soma prefixa global se o número de blocos no passo 1 é maior que o tamanho do bloco. 64

65 Primitivos paralelos Redução – Entrada Sequência A de n elementos de um tipo T Operador binário associativo op – Saída: v alor do tipo T igual ao último elemento da soma prefixa inclusiva da sequência de entrada A – Exemplo: T = int, op = Entrada A saída

66 Primitivos paralelos Compactação – Entrada Sequência A de n elementos de um tipo T Sequência V de n booleanos indicando os elementos válidos – Saída: s equência B de m elementos do tipo T, onde m n é igual à redução (soma) do vetor V – Exemplo: T = int V 2368 A 1457 B m Índices de B (soma prefixa exclusiva de V)

67 Estudo de caso: traçado de raios Por que traçado de raios? – Renderização fotorealística e fisicamente correta – Mais fácil de combinar vários efeitos visuais Sombras suaves Iluminação indireta Superfícies reflexivas e polidas Transparência Profundidade de campo Motion blur Etc. 67

68 Estudo de caso: traçado de raios Por que traçado de raios em GPU? – Capacidade de processamento e paralelismo – Algoritmos híbridos: RT e rasterização 68

69 Estudo de caso: traçado de raios Traçado de raios em tempo real em GPU? – Vários trabalhos na literatura – NVIDIA city demo 69

70 Estudo de caso: traçado de raios Soluções interativas NVIDIA – OptiX (www.nvidia.com/object/optix.html) – iray ( https://www.mentalimages.com/products/nvidia-iray/rendering.html ) 70

71 Estudo de caso: traçado de raios Traçado de raios básico Implementação em CUDA – Raios secundários de reflexão e transparência – Número de atores e luzes limitado à memória disponível – Traçado de raios não distribuído – Sem tratamento de textura – Geometria dos atores definida por malha de triângulos – Iluminação direta pelo modelo de Phong 71

72 Traçado de raios básico TR básico: um raio de pixel por pixel 72

73 Traçado de raios básico 73

74 Traçado de raios básico 74

75 Traçado de raios básico 75

76 Traçado de raios básico 76

77 Traçado de raios básico Condições de parada – Redução do peso de um raio em cada nível de recursão até um peso mínimo – Nível de recursão máximo 77

78 Traçado de raios básico Exemplo – Cena com atores 4 fontes de luz – triângulos – 10 níveis de recursão – Imagem 1024x768 pixels 78

79 Traçado de raios básico 79

80 Traçado de raios básico 80

81 Traçado de raios básico 81

82 Traçado de raios básico 82

83 Traçado de raios básico Problemas com o traçado de raios – Aliasing Solução: mais raios por pixel – Super-amostragem regular ou adaptativa – Traçado de raios distribuido – Gargalo: interseção raio/objeto No exemplo: – raios disparados – interseções raio/triângulo Força bruta impraticável Solução: estruturas de aceleração – Grade regular – Octree – Kd-tree – BVH (boundary volume hierarchy) 83

84 BVH: árvore binária de AABBs Traçado de raios básico 84

85 BVH: árvore binária de AABBs Traçado de raios básico 85

86 BVH: árvore binária de AABBs Traçado de raios básico 86

87 Implementação em CUDA Algoritmo: megakernel – Único kernel – Uma thread por pixel: raios primários e secundários – Usa pilha de raios secundários (uma por thread) Cada entrada da pilha armazena origem, direção, coeficiente, e peso de um raio Armazenada em memória local (tão lenta quanto a global) – Parâmetros Ponteiros para as estruturas de dados de entrada na memória global são agrupados em uma estrutura na memória constante Dados da câmera virtual, luz ambiente, cor de fundo da cena e ponteiro para a imagem a ser gerada (frame) são passados como argumentos para o kernel 87

88 Implementação em CUDA 88

89 Implementação em CUDA 89

90 Implementação em CUDA Algoritmo: megakernel – Vantagens É simples e funciona... Só um kernel, só um contexto CUDA – Problemas Divergência do caminho de execução de threads de um warp Acesso não coalescido à memória global Sem uso da memória compartilhada 90

91 Resultados Cena de teste – triângulos reflexivos – BVH com nós – Resolução da imagem, número de luzes e nível máximo de recursão variáveis Equipamento – CPU: Intel Xeon 2.4 GHz, 12 GB RAM – GPU: NVIDIA Tesla C2050 (448 núcleos, 3GB RAM) 91

92 Resultados 4 luzes, 10 níveis de recursão 92

93 Resultados 4 luzes, 10 níveis de recursão 93

94 Resultados 4 luzes, 10 níveis de recursão 94 ResoluçãoFPSSpeedupEficiência % 320x2403,314,43,2 640x4801,018,14,0 800x6000,719,84,4 1024x7680,520,64,6

95 Resultados 1024x758 pixels, 10 níveis de recursão 95

96 Resultados 1024x758 pixels, 10 níveis de recursão 96

97 Resultados 1024x758 pixels, 10 níveis de recursão 97 N. luzesFPSSpeedupEficiência % 10,714,93,3 20,616,53,7 40,520,64,6 80,327,46,1

98 Resultados 1024x768 pixels, 4 luzes 98

99 Resultados 1024x768 pixels, 4 luzes 99

100 Resultados 1024x768 pixels, 4 luzes 100 N. recursãoFPSSpeedupEficiência % 02,236,78,2 10,927,66,2 50,521,34,7 100,520,64,6


Carregar ppt "Tópicos sobre GPGPU em CUDA Paulo A. Pagliosa Faculdade de Computação Universidade Federal de Mato Grosso do Sul Natal, maio de."

Apresentações semelhantes


Anúncios Google