View
118
Download
2
Category
Preview:
Citation preview
Tópicos sobre GPGPU em CUDAPaulo A. Pagliosa
pagliosa@facom.ufms.br
Faculdade de ComputaçãoUniversidade Federal de Mato Grosso do Sul
Natal, maio de 2013
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
Introdução a GPGPU
• GPUs: unidades de processamento gráfico– Originalmente projetadas para processamento
gráfico 3D– Exemplos
3
NVIDIA GeForce 8800 GTXNVIDIA Tesla C1060
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
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
Hardware
Exibição
Framebuffer
Rasterização
Processamento de geometria
Processamento de fragmentos
Introdução a GPGPU
• Pipeline gráfico fixo (OpenGL)
6
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
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 (1999-2000)– Transformações geométricas– Iluminação– Velocidade de renderização maior– Exemplos: GeForce 2, ATI 5700
8
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
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
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
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
Introdução a GPGPU
• GPUs de terceira geração (2001-2002)– 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 (2003-2006)– 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 9800
13
Introdução a GPGPU
14
• NVIDIA GeForce 6800– Até 6 processadores de vértices– 16 processadores de fragmentos
Introdução a GPGPU
• Linguagens de shaders– Cg (C for graphics), NVIDIA– HLSL (High Level Shader Language), Microsoft– GLSL (OpenGL Shader Language)
15
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
Introdução a GPGPU
• Exemplos– Simulação dinâmica de corpos rígidos
– Multiplicação de matrizes potência de dois18
•Sem restrições •Com detecção de colisões
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 200
19
Introdução a GPGPU
20
• NVIDIA GeForce 8800 GTX– 16 multiprocessadores (SMs)– 8 processadores (SPs) por multiprocessador
Introdução a GPGPU
• Aplicações CUDA– Visualização e simulação
– http://www.nvidia.com/object/cuda_home_new.html 21
•Traçado de raios •Simulação de fluídos
Introdução a GPGPU
• CUDA: arquitetura de computação paralela para GPGPU
22
Introdução a GPGPU
• Por que CUDA?– Desempenho versus custo– NVIDIA é líder de mercado: mais de 108 GPUs– Programação paralela para muitos– Tesla, Fermi e Kepler
• Instalação de CUDA1. Driver2. CUDA toolkit (compilador e bibliotecas)3. CUDA SDK (utilitários e exemplos)
• https://developer.nvidia.com/cuda-downloads23
Introdução a GPGPU
• Bibliografia (http://docs.nvidia.com/cuda/index.html)
– CUDA Programming Guide– CUDA Reference Manual– CUDA Best Practices Guide
24
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
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
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
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
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
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
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
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
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
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 CUDA34
APIs exclusivas
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
Fundamentos de programação CUDA
• Programa básico em C para CUDA– Seleção do dispositivo a ser usadocudaSetDevice()
– Alocação de memória no dispositivocudaMalloc()
– Transferência de dados entre host e dispositivocudaMemcpy()
– Liberação de memória no dispositivocudaFree()
– FinalizaçãocudaDeviceReset()
36
Fundamentos de programação CUDA
37
• Exemplo: multiplicação de matrizes– Sem memória compartilhada
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
Fundamentos de programação CUDA
39
• Exemplo: multiplicação de matrizes– Com memória compartilhada
Fundamentos de programação CUDA
• Exemplo: transposição de matrizes
40
__syncthreads()
Mem. compartilhada
Fundamentos de programação CUDA
• Exemplo: transposição de matrizes
41
Mem. compartilhada
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
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
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.
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
Dicas de performance
• Memória global– Com coalescência
46
Dicas de performance
47
• Memória global– Sem coalescência
Dicas de performance
48
• Memória global– Sem coalescência
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
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
Dicas de performance
51
• Mem. compartilhada– Sem conflitos
Dicas de performance
• Mem. compartilhada– Com conflitos
52
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
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: sequência B de n elementos do tipo T
– Exemplo: T = int, op = +, I = 0
54
1 2 3 4 5 6 7 8
0 1 3 6 10 15 21 28
Entrada A
Saída B
Soma prefixa exclusiva
36
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: sequência de n elementos do tipo T
– Exemplo: T = int, op = +, I = 0
55
1 2 3 4 5 6 7 8
1 3 6 10 15 21 28 36
Entrada A
Saída B
Soma prefixa inclusiva
Primitivos paralelos
• Redução– Entrada
• Sequência A de n elementos de um tipo T• Operador binário associativo op
– Saída: valor do tipo T igual ao último elemento da soma prefixa inclusiva da sequência de entrada A
– Exemplo: T = int, op = +
65
1 2 3 4 5 6 7 8
1 3 6 10 15 21 28 36
Entrada A
saída
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: sequência B de m elementos do tipo T, onde m ≤ n é igual à redução (soma) do vetor V
– Exemplo: T = int
66
1 0 0 1 1 0 1 0 V
1 2 3 4 5 6 7 8A 1 4 5 7B
m0 1 1 1 2 3 3 4 4Índices de B
(soma prefixa exclusiva de V)
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
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
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
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
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
Traçado de raios básico
• TR básico: um raio de pixel por pixel
72
Traçado de raios básico
• Raios de pixel– A partir da posição da câmera, e em direção ao centro de
cada pixel da janela de projeção, trace um raio de pixel . A cor de é a cor do pixel correspondente da imagem
– Determine os objetos da cena que intercepta– Se nenhum objeto for interceptado, então atribua à cor do
pixel a cor de fundo da cena– Senão, seja o ponto de interseção de com o objeto mais
próximo da origem de
73
Traçado de raios básico
• Raios de sombra ou luz– A partir de dispare um raio de luz em direção à cada fonte
de luz – Se não interceptar nenhum ator (opaco) da cena, então
ilumina diretamente : adicione à a contribuição da luz determinada pelo modelo de iluminação de Phong
– Dependendo das propriedades de , outros raios podem ser disparados (raio de reflexão e raio de refração)
74
Traçado de raios básico
• Raios de reflexão– Se for suficientemene polido em , um raio é disparado de
em uma direção definida pela direção de e pela normal da superfície de no ponto
– A determinação da cor de é feita executando-se recursivamente o algoritmo, que trata como um novo raio de pixel e como o ponto de vista do observador. A cor de é somada à cor de
75
Traçado de raios básico
• Raios de refração ou transparência– Se for suficientemene transparente em , um raio é
disparado de em uma direção definida pela direção de , pela normal da superfície de no ponto e pela razão dos índices de refração do meio do qual parte e de
– A determinação da cor de é feita executando-se recursivamente o algoritmo, que tratacomo um novo raio de pixel e como o ponto de vista do observador. A cor de é somada à cor de
76
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
Traçado de raios básico
• Exemplo– Cena com 1.384 atores 4 fontes de luz– 708.108 triângulos– 10 níveis de recursão– Imagem 1024x768 pixels
78
Traçado de raios básico
79
Traçado de raios básico
80
Traçado de raios básico
81
Traçado de raios básico
82
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:
– 5.377.387 raios disparados– 2.985.241 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
• BVH: árvore binária de AABBs
Traçado de raios básico
84
𝑡 3𝑡 4𝑡5𝑡 6𝑡 0𝑡1𝑡 2
𝑏0𝑡 0
𝑡1
𝑡5
𝑡 2
𝑡 3
𝑡 4
𝑡 6
𝑝1 𝑝2 𝑝3
• BVH: árvore binária de AABBs
Traçado de raios básico
85
𝑡 3𝑡 4𝑡1𝑡 6𝑡 0𝑡5𝑡 2
𝑏0𝑏1𝑏2𝑡 0
𝑡1
𝑡5
𝑡 2
𝑡 3
𝑡 4
𝑡 6
𝑝1
𝑝2
𝑝3
• BVH: árvore binária de AABBs
Traçado de raios básico
86
𝑡 2𝑡 4𝑡1𝑡 6𝑡 0𝑡5𝑡 3
𝑏3𝑏4𝑏0𝑏1𝑏2𝑡 0
𝑡1
𝑡5
𝑡 2
𝑡 3
𝑡 4
𝑡 6
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
Implementação em CUDA
• Algoritmo: megakernel1. A -ésima thread gera o raio de pixel a ser traçado e o
armazena na pilha de raios . A origem e direção do raio são determinadas em função da câmera virtual, o coeficiente do raio é a cor branca e o peso do raio é 1
2. Enquanto houver raios em , faça os passos 3 a 63. Retire o raio da pilha 4. Se não interceptar a cena, então a cor de fundo da cena é
ponderada pelo coeficiente do raio e é acumulada à cor do pixel frame[]. Vá ao passo 2
88
Implementação em CUDA
• Algoritmo: megakernel5. Trace um raio de sombrado ponto de interseção para cada
fonte de luz da cena. Se não interceptar um objeto opaco antes de atingir a fonte de luz, a contribuição de é o produto do coeficiente de pela cor calculada segundo o modelo de iluminação de Phong. Este valor é então acumulado à cor final do pixel frame[]
6. Se o material do objeto possuir propriedades reflexivas e/ou transparentes, e as condições de parada não foram atingidas, então gere o(s) raio(s) secundário(s) com base nestas propriedades e insira-o(s) em . Vá ao passo 2
89
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
Resultados
• Cena de teste– 708.108 triângulos reflexivos– BVH com 229.037 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
Resultados
• 4 luzes, 10 níveis de recursão
92
775.938 3.105.314 4.850.202 7.946.907320x240 640x480 800x600 1024x768
0
500,000
1,000,000
1,500,000
2,000,000
2,500,000
3,000,000
3,500,000
4,000,000
Raios por segundo/Resolução
CPUGPU
Resultados
• 4 luzes, 10 níveis de recursão
93
320x240 640x480 800x600 1024x768
CPU 4.34919 17.29244 27.58072 43.57401
GPU 0.30129 0.95782 1.39151 2.11677
2.507.50
12.5017.5022.5027.5032.5037.5042.50
Tempo (s)/Resolução
CPUGPU
Resultados
• 4 luzes, 10 níveis de recursão
94
Resolução FPS Speedup Eficiência %320x240 3,3 14,4 3,2640x480 1,0 18,1 4,0800x600 0,7 19,8 4,4
1024x768 0,5 20,6 4,6
Resultados
• 1024x758 pixels, 10 níveis de recursão
95
3.54
1.17
2
5.02
8.74
2
7.94
6.90
7
13.3
85.0
33
1 2 4 8
0
1,000,000
2,000,000
3,000,000
4,000,000
5,000,000
Raios por segundo/Número de luzes
CPUGPU
Resultados
• 1024x758 pixels, 10 níveis de recursão
96
1 2 4 8
CPU 22.34137 28.406 43.57401 84.59079
GPU 1.49803 1.71694 2.11677 3.08224
5.0015.0025.0035.0045.0055.0065.0075.0085.00
Tempo (s)/Número de luzes
CPUGPU
Resultados
• 1024x758 pixels, 10 níveis de recursão
97
N. luzes FPS Speedup Eficiência %1 0,7 14,9 3,32 0,6 16,5 3,74 0,5 20,6 4,68 0,3 27,4 6,1
Resultados
• 1024x768 pixels, 4 luzes
98
3.177.096 6.008.502 7.887.115 7.946.9070 1 5 10
0
1,000,000
2,000,000
3,000,000
4,000,000
5,000,000
6,000,000
7,000,000
8,000,000
Raios por segundo/Níveis de recursão
CPUGPU
Resultados
• 1024x768 pixels, 4 luzes
99
0 1 5 10
CPU 16.77608 29.55958 43.4742 43.574
GPU 0.45668 1.07006 2.04447 2.11677
2.507.50
12.5017.5022.5027.5032.5037.5042.5047.50
Tempo (s)/Níveis de recursão
CPUGPU
Resultados
• 1024x768 pixels, 4 luzes
100
N. recursão FPS Speedup Eficiência %0 2,2 36,7 8,21 0,9 27,6 6,25 0,5 21,3 4,7
10 0,5 20,6 4,6
Recommended