LOGO
“ Add your company slogan ”
GPGPU: OpenCL, CUDA e Shaders
Introdução à Multimídia – CIn - UFPE
Equipe
Aline Éllida D’Oleron Vasconcelos Ângelo Lima Mazer Luiz Gustavo da Rocha Charamba Márcio Ricardo Alves Gadelha de Araújo Sílvio Gustavo de Oliveira Santos
Graduação em Engenharia da Computação
Roteiro Aline:
O que é GPGPU(Introdução) GPU(Visão geral) História e Evolução Macro arquitetura Frameworks(CUDA, OpenCL, Shaders)
Sílvio: Shaders
Charamba: Cuda
Márcio: OpenCL
Ângelo: Relacionar aplicações com RV e RA Aplicações Tendências Futuras Conclusão
GPGPU
• O que é GPGPU ?
• Uma Visão geral sobre GPU
• História e Evolução
• Evolução do processamento das GPUs
• Funcionamento das GPUs
• Linguagens
O que é GPGPU?
General Purpose Graphics Processing Unit(Unidade de Processamento Gráfico para Propósito Geral)
Alta velocidade GPGPU é uma técnica de usar uma GPU,
que normalmente lida apenas com computação gráfica, para realizar computação em aplicações tradicionalmente tratadas pela CPU.
Uma visão geral sobre GPU
Reduzir a carga geral da CPU Maior velocidade Imagens com maior qualidade. Efetuar complexos cálculos matemáticos e
geométricos Capacidade de processar vetores e
matrizes com facilidade.
História e Evolução
Antes da criação das GPUs, as aplicações gráficas (em especial os jogos) eram baseados apenas em polígonos ou seja, na geometria da cena.
História e Evolução
Placas Aceleradoras 1995: Primeira placa gráfica comercial:
3dxf voodoo Mapeamento de texturas geométricas
1999: Placas aceleradoras 3D GeForce 256 (NVidia) Criação do conceito de pipeline gráfico Transformação dos vértices dos polígonos e
pela iluminação dos mesmos.
EverQuest
EverQuest
EverQuest 1999
Warcraft
Warcraft
1994
História e Evolução
2001: placas gráficas programáveis GeForce 3, GeForce 4 e Radeon 8500. A programação só era possível no
processador de vértices. Tinha diversas limitações quanto a sua
funcionalidade. Criado o conceito de texturas 3D.
Max Payne
Max Payne
2001
História e Evolução
2002: o processador de fragmentos também se tornou programável. GeForce FX, Radeon 9600-9800 e Radeon
X600-800 Faziam computação muito mais eficiente e
flexível do que a geração anterior.
Warcraft III 2001
História e Evolução
Atualmente: DirectX 10. A Nvidia GeForce 8 e a ATI Radeon HD2900
implementaram uma nova arquitetura:• o estágio de vértices, o novo estágio de geometria
e o estágio de fragmentos.
DirectX9
DirectX10
Evolução do processamento das GPUs
Ilustrando o poder desta evolução temos que o número de operações de ponto flutuante destes processadores, quando comparados com os processadores de propósito geral do mercado, cresce mais rápido ao longo dos anos.
Evolução do processamento da s GPUs
Funcionamento das GPUs
Pipeline gráfico
Funcionamento das GPUs
Modelo de Processamento (Stream Processing) pode processar uma maior variedade de
dados e com maior paralelismo.
Linguagens
CUDA : Arquitetura de computação paralela da NVIDIA que possibilita aumentos significativos na performance de computação pelo aproveitamento da potência da GPU.
Linguagens
OpenCL: (Linguagem de Computação Aberta) é um novo ambiente computacional multiplataforma. Ela permite que os desenvolvedores aproveitem o grande poder da computação paralela das GPUs para criar poderosas aplicações de computação.
Shaders
• O que são shaders?
• Pipeline fixo
• Pipeline programável
• Linguagens
• Exemplos
O que são shaders?
São programas que rodam na GPU e que determinam como um objeto será renderizado.
O que são shaders?
Antes dos shaders, a GPU oferecia somente um conjunto de efeitos pré-programado de efeitos. Efeitos de luz, perspectiva, textura... Gráficos pouco realistas
A partir da criação dos shaders, foi possível criar efeitos que aumentam o realismo das cenas 3D
Suportado a partir do DirectX 8 e OpenGL 1.4
Pipeline Fixo
Somente alguns comandos fixos disponíveis via API Transformações e Iluminação via API Texturização via API
Bastante restrito
Pipeline Fixo
Pipeline Programável
Código customizável escrito pelo programador e executado pela GPU.
Necessário definir as transformações de cor e textura.
Permite materias mais realistas (metais, pedra, madeira)
Pipeline Programável
Pipeline Programável
As GPUs atuais permitem programar 3 tipos de shaders:
Vertex shaders Geometry shaders Pixel shaders
Vertex Shader
Programa que opera sobre os vértices e sobre os dados associados (cor, iluminação, textura).
O programa é executado uma vez para cada vértice, sem informações sobre os demais vértices.
Vertex Shader
O processador de vértices executa o shader, que pode realizar as seguintes operações sobre os vértices: Transformações de posição Transformações de textura Transformações de iluminação
Para cada vértice de entrada, gera um único vértice de saída.
Vertex Shader
Geometry Shader
Programa que opera sobre as primitivas (pontos, linhas e triângulos).
Permite que novos vértices sejam adicionados ou removidos, alterando o número de primitivas.
Geometry Shader
Deste modo, é responsável pelo nível de detalhe do objeto.
A partir de cada primitiva de entrada, gera uma ou mais primitivas de saída.
Geometry Shader
Pixel Shader
Programa executado sobre todos os pixels que compõem uma primitiva.
É executado uma vez para cada pixel que compõe a primitiva.
Pixel Shader
Alguns operações possíveis que o processador de pixels pode executar: Determinar cores dos pixels Coordenadas de textura Iluminação e sombras
Não pode alterar posições dos pixels.
Pixel Shader
Linguagens
RenderMan Shading Language Criada no final da década de 80 Uma das primeiras linguagens para criação
de shaders Permitiu que parte do pipeline gráfico fosse
substituído por pequenos programas (shaders)
Não é destinado a renderização em tempo real
Linguagens
HLSL – High Level Shading Language Linguagem proprietária da Microsoft Usada pra desenvolver com Direct3D
GLSL – OpenGL Shading Language Usada para criar shaders em OpenGL Multi-plataforma
Cg – C for Graphics Dsenvolvida pela Nvidia em conjunto com a MS Similar a HLSL
Shaders - Exemplos
Jogos sem shaders
Jogos com shaders
Shaders - Exemplos
Shaders - Exemplos
Comparação de shadershttp://www.youtube.com/watch?v=kRdl4C_6Ydw
Vertex e Pixel shadershttp://www.youtube.com/watch?v=lA4Z5Eutzp0
Vertex shadershttp://www.youtube.com/watch?v=KkccB1OvQjs
CUDA
• O que é CUDA?
• Arquitetura CUDA
• API CUDA
• Usando CUDA
• Aplicações com CUDA
O que é CUDA?
CUDA (Compute Unified Device Architecture )
CUDA é um modelo de programação paralela e um ambiente de software projetado para desenvolver aplicações que utilizam de forma eficiente o número de cores disponíveis no sistema.Tudo isso de forma escalável e transparente.
Tecnologia NVIDIA.
Arquitetura CUDA
CUDA é composta de três abstrações principais.
Arquitetura CUDA
CUDA é composta de três abstrações principais. Uma hierarquia de grupo de threads;
Arquitetura CUDA
CUDA é composta de três abstrações principais. Uma hierarquia de grupo de threads; Memórias compartilhadas;
Arquitetura CUDA
CUDA é composta de três abstrações principais. Uma hierarquia de grupo de threads; Memórias compartilhadas; Sincronização via barreiras.
Arquitetura CUDA
CUDA é composta de três abstrações principais. Uma hierarquia de grupo de threads; Memórias compartilhadas; Sincronização via barreiras.
Estas abstrações possibilitam o paralelismo de dados e threads. O programador particiona o problema em subproblemas que podem ser solucionados independentemente em paralelo. Cada subproblema pode ser agendado para ser executado em qualquer um dos núcleos disponíveis, apenas o sistema de runtime precisa saber quantos núcleos estão disponíveis.
Arquitetura CUDA
Hierarquia de memória Comparativo entre CPU e GPU. Um mesmo trecho de código é executadoem paralelo para diferentes blocos de dados e com uma cache para cada núcleo da GPU.
Arquitetura CUDA
Hierarquia de memória Comparativo entre CPU e GPU. Um mesmo trecho de código é executadoem paralelo para diferentes blocos de dados e com uma cache para cada núcleo da GPU.
Estas pequenas cachespossuem acesso rápido para leitura e escrita, permitindo o compartilhamento detarefas entre as threads.Reduzindo o acesso a memórias externas, diminuindo a latência.
API CUDA
A pilha de software do CUDA, envolve uma API com suporte direto adiversas funcões matemáticas, primitivas de computação gráfica, bibliotecas, suporte aoruntime e ao driver, que otimiza e gerencia a utilização de recursos diretamente com aGPU.
API
API CUDA
Bibliotecas de Runtime. Tem a função de gerenciar operações da
CPU em comunicação com GPU. Gerencia núcleos disponíveis na GPU.
Funções para CPU:
- Gerenciamento:- GPU- Memória- Controle de tempo de
execução- Interoperabilidade entre
OpenGL e Direct3D
Bibliotecas de Runtime. Tem a função de gerenciar operações da
CPU em comunicação com GPU. Gerencia núcleos disponíveis na GPU.
API CUDA
Funções para CPU:
- Gerenciamento:- GPU- Memória- Controle de tempo de
execução- Interoperabilidade entre
OpenGL e Direct3D
Bibliotecas de Runtime. Tem a função de gerenciar operações da
CPU em comunicação com GPU. Gerencia núcleos disponíveis na GPU.
API CUDA
Funções para GPU:
- Matemáticas Otimizadas
- Sincronização das Threads
- Texturas- Funções para
garantir atomicidade
Usando CUDA
Requisitos para a utilização Placas Gráficas: NVIDIA GeForce série
8 ou superior
Usando CUDA
Requisitos para a utilização Placas Gráficas: NVIDIA GeForce série
8 ou superior
NVIDIA Quadro
Usando CUDA
Requisitos para a utilização Placas Gráficas: NVIDIA GeForce série
8 ou superior
NVIDIA Quadro
NVIDIA Tesla
Usando CUDA
Requisitos para a utilização Placas Gráficas:
Linguagens:• C • C ++ (futuramente)• FORTRAN (futuramente)• Java, FORTRAN e Python (feito por terceiros)
NVIDIA GeForce série 8 ou superior
NVIDIA Quadro
NVIDIA Tesla
Aplicações com CUDA
Várias aplicações com CUDA NVIDIA CUDA Day Demos - Feb. 2010, San
Francisco• http://www.youtube.com/watch?v=ZOGLkl9cFPw&f
eature=fvw
Simulação de Partículas em tempo real NVIDIA CUDA realtime particles demo
• http://www.youtube.com/watch?v=RqduA7myZok
OpenCL
• O que é OpenCL?• Working Group
• OpenCL 1.1
• Processor Parallelism• It’s a heterogeneous World
• Arquitetura OpenCL
• OpenCL At Work
• Timeline
• Models
• Programming Kernels• Summary
• Exemplos
O que é OpenCL?
OpenCL (Open Computing Language) é uma linguagem de programação para computadores para uso geral de programação paralela de sistemas heterogêneos.
A linguagem é aberta, livre de royalties e visa ser multi-plataforma.
Ela consiste numa API para coordenar a computação paralela.
O que é OpenCL?
OpenCL proporciona um ambiente de programação uniforme para os desenvolvedores de software para escrever código eficiente e portátil para computação de alto desempenho, servidores, sistemas de computadores desktop e dispositivos móveis através de um diversificado mix de multi-core CPUs, GPUs, Cells e DSPs.
OpenCL Working Group
Diversa participação da indústria Ex: Fornecedores de processadores,
fabricantes de sistema, desenvolvedores de aplicativos
Muitos especialistas líderes da indústria envolvidos no projeto OpenCL
Apple fez a proposta inicial e é muito ativa no grupo de trabalho
OpenCL Working Group
OpenCL Timeline
Inicialmente desenvolvida pela Apple Apple submeteu proposta inicial ao
Khronos Group Aprovada como release pública
OpenCL 1.1
Período de 18 meses entre OpenCL 1.0 e OpenCL 1.1 Totalmente compatível com OpenCL 1.0 Novos tipos de dados Incluindo 3 componentes de vetores e
formatos de imagem adicionais Comandos de manipulação de vários
hospedeiros Buffers de processamento em vários
dispositivos
OpenCL 1.1
Operações em regiões de um buffer Incluindo ler, escrever e cópia do 1D, 2D ou 3D
regiões retangulares Uma maior utilização de eventos Para dirigir e controlar a execução de comandos Adicional OpenCL C built-in funções Melhoria da interoperabilidade OpenGL Partilha eficiente de imagens e buffers ligando
eventos OpenCL e OpenGL
Processor Parallelism
It’s a Heterogeneous World
A modern platform Includes: One or more CPUs One or more GPUs DSP processors other?
OpenCL lets Programmers write a single portable program that uses ALL resources in the heterogeneous platform.
Arquitetura OpenCL
OpenCL API
Functions that allow an application to manage parallel computing tasks
It enumerates the OpenCL-capable hardware in a system
sets up the sharing of data structures between the application and OpenCL
controls the compilation and submission of kernels to the GPU
and has a rich set of functions that manage queuing and synchronization
OpenCL Runtime
Executes tasks submitted by the application via the OpenCL API
The runtime efficiently transfers data between main memory and the dedicated VRAM used by the GPU, and directs execution of the kernels on the GPU hardware
During execution, manages the in-order or out-of-order dependencies between the kernels, and utilizes the GPU’s processing elements in the most efficient manner
OpenCL at Work
At startup, the application calls the OpenCL API to determine which GPUs are available in the system. It then selects the appropriate GPUs and creates command queues. The application loads and compiles the OpenCL C kernels it will use.
OpenCL at Work
When the application is ready to execute a kernel, it calls the OpenCL API to specify the data and the number of parallel kernel instances required.
The OpenCL runtime moves the data required by the kernel up to the GPU’s VRAM. The GPU then executes the kernel simultaneously on its processing elements.
OpenCL Platform Model
One Host + one or more Compute Devices Each Compute Device is composed of one or more
Compute Units• Each Compute Unit is further divided into one or more
Processing Elements
OpenCL Execution Model An OpenCL application runs on a host which
submits work to the compute devices Work item: the basic unit of work on an OpenCL device Kernel: the code for a work item. Basically a C function Program: Collection of kernels and other functions
(Analogous to a dynamic library) Context: The environment within which workitems executes
… includes devices and their memories and command queues
Applications queue kernel execution instances Queued in-order … one queue to a device Executed in-order or out-of-order
OpenCL Memory Model
Private Memory Per work-item
Local Memory Shared within a workgroup
Global/Constant Memory Visible to all workgroups
Host Memory On the CPU
Programming kernels: OpenCL C Language
A subset of ISO C99 But without some C99 features such as standard C99 headers,
function pointers, recursion, variable length arrays, and bit fields
A superset of ISO C99 with additions for: Work-items and workgroups Vector types Synchronization Address space qualifiers
Also includes a large set of built-in functions Image manipulation Work-item manipulation, Specialized math routines, etc.
Programming Kernels: Data Types
Scalar data types char , uchar, short, ushort, int, uint, long, ulong,
float bool, intptr_t, ptrdiff_t, size_t, uintptr_t, void, half
(storage) Image types
image2d_t, image3d_t, sampler_t Vector data types
Vector lengths 2, 4, 8, & 16 (char2, ushort4, int8, float16, double2, …)
Vector operations
Building Program Objects
The program object encapsulates: A context The program source/binary List of target devices and build options
OpenCL Synch: Queues & Events
Events can be used to synchronize kernel executions between queues
Example: 2 queues with 2 devices
OpenCL Summary
OpenCL vs CUDA
OpenCL Plataforma heterogênea (GPUs Nvidia, ATI
Radeon; CPU Intel). Não tira o máximo aproveitamento do
hardware, como CUDA tira numa GPU Nvidia. Freeware. Possui suporte Nvidia.
CUDA Plataforma homogênea (Apenas GPUs
Nvidia). Expõe uma rápida memória compartilhada
que podem ser compartilhados entre threads. Tecnologia mais madura, possui mais
recursos. Possui suporte Nvidia.
Exemplos
Apple Mac OS X Snow Leopard já vem com o OpenCL
http://www.youtube.com/watch?v=r1sN1ELJfNo http://www.youtube.com/watch?v=IEWGTpsFtt8 http://www.youtube.com/watch?v=33rU1axSKhQ http://www.youtube.com/watch?v=7PAiCinmP9Y http://www.youtube.com/watch?v=-GeB1HOt_U0 http://www.youtube.com/watch?v=8z2zDwzK5Kg
Aplicações
• Finanças
• CAD/CAM/CAE
• Dinâmica de fluidos
• Filmes e Entretenimento
• Serviços de informação geográfica (GIS)
• Imaging
• Gás e Petróleo
• Clusters
Finanças
• mercado de alto risco
• algorítmos complexos modelam o mercado e ajudam os negociadores e investidores a tomarem decisão
• Monte Carlo• Avalia inúmeras variáveis como taxa de juros,
preços de commodity etc.• Consome muito tempo
Finanças
• SciFinancial – desenvolvido por SciComp
• Software que gera código C/C++ de espeficicações de modelos em alto nível
• Código compilável para GPU• faz uso da sua capacidade de paralelização • ganho de velocidade variando entre 30 e 100 vezes
com uma NVIDIA Tesla C1060 GPU• Velocidade aumenta aproximadamente linearmente com
o aumento do número de GPUs
Solução com GPU
CAD/CAM/CAE
• Tradicionalmente, designers criam amostras reais para prototipar e mostrar para investidores
• Processo caro e demorado
• OptiTex moderniza o processo tradicional usando uma engine 3D própria
• Permite simular o visual e o movimento das peças em modelos virtuais • São Paulo Fashion week Virtual ?
CAD/CAM/CAE
Solução com GPU
• 190 dias eram nesecessários no desenvolvimento de um produto
• 35 dias são nescessários atualmente após reconstrução de sua engine usando GPU
Dinâmica de fluidos
• National Center for Atmospheric Research (NCAR) desenvolveu um modelo de previsão de tempo bastante sofisticado• Aplicações saindo da escala dos Terabytes para a dos Petabytes
• Crescendo além dos clusters convencionais
Dinâmica de fluidos
Solução com GPU
• portaram o modelo para CUDA
• ganho de 10X em calculos de microfísica ( < 1% do código )
• aumento em 20% da velocidade do modelo em geral
Filmes e Entretenimento
• Weta digital ficou responsável por criar sequências com 800 “CGs characters”
• Quantidade de poligonos medidos em bilhões no lugar dos milhões
Filmes e Entretenimento
• Weta e NVIDIA criaram uma engine chamada PentaRay
• Alcançaram um ganho de velocidade de 25X depois de portarem a engine para CUDA
• NVIDIA Tesla® S1070
Solução com GPU
GIS
• Planejadores usam aplicações GIS para:• mapear informações de localização• dados demográficos• população• layout das ruas e avenidas• etc
• Conjunto de dados não para de crescer. Gigabytes de:• mapas interativos• camadas de superfície• imagens
GIS
• Menifold.net converteu seu Software para CUDA
• Programas que rodavam em 20 minutos rodam em 30 segundos
Solução com GPU
• Programas que rodavam em 30 – 40 segundos rodam em tempo real
Imaging
• Professor Hongen Liao desenvolveu uma maneira de projetar obejtos 3D no ar ( Integral Videography )
• Em 2001:• 10 segundos para gerar um único frame com um pentium 3 a 800MHz• 5 fps usando UltraSPARC III 900 MHz
• Não era rápido o suficiente...
Imaging
• Teste em uma GeForce® 8800 GTX geraram 13 – 14 fps
• CUDA foi usada como Plataforma de desenvolvimento
Solução com GPU
Gás e Petróleo
• Custo de perfurações são muito altos
• Modelagens 3D são utilizadas para achar lugares potenciais
• O cluster da SeismicCity precisaria de 20.000 CPUS para rodar seu algoritmo
Gás e Petróleo
• Porte para NVIDIA® Tesla™ S870 resultou em ganho de 20X na performance
• Solução com CUDA permite usar novos códigos mais rapidamente e com menor custo
Solução com GPU
Clusters
• NCSA desenvolveu código open source ( HOOMD-blue )• código para dinâmica molecular
Clusters
• Simulação, em GPU, roda na mesma velocidade que nos 128 CPUs de um Cray XT3
Solução com GPU
Futuro
• cGPU• Cores agrupados em 32 unidades• 16 grupos • 512 cores no total• GDDR5
Futuro
• Hardware Thread Schedule (HTS)• trata o escalonamento para o programador
Futuro
Conclusão
• Alto poder de paralelização
• Multidiciplinar
• Capacidade de realizar muitos cálculos de ponto flutuante
• Suporte à várias bibliotecas
Dúvidas
?
Referências• http://www.verlab.dcc.ufmg.br/_media/cursos/arquitetura/2007-1/grupo3/seminario_gru
po3.pdf• http://www.uri.com.br/~adario/disciplinas/AC2/files/Artigo%20GPU.pdf• http://www.tupinihon.com/tech/pdf/artigo-gpu.pdf• http://www.nvidia.com.br/• http://en.wikipedia.org/wiki/HLSL• http://en.wikipedia.org/wiki/OpenGL_Shading_Language• http://en.wikipedia.org/wiki/Cg_(programming_language)• http://www.davidcornette.com/glsl/intro.html• http://www.lighthouse3d.com/opengl/glsl/index.php?intro• http://devtuts.com.br/wp/2010/04/introducao-completa-aos-shaders/• http://desenvolvimentodejogos.wikidot.com/shaders• http://www.gdhpress.com.br/blog/shaders/• Computacão de alto desempenho utilizando CUDA• Bruno Cardoso Lopes, Rodolfo Jardim de Azevedo• URL: www.brunocardoso.cc/cuda/cuda.pdf• Blog do John Tortugo• URL: http://johntortugo.wordpress.com/2008/12/30/cuda-modelo-de-programacao-para
lela/
Referências• http://www.verlab.dcc.ufmg.br/_media/cursos/arquitetura/2007-• http://www.khronos.org/opencl/• http://www.khronos.org/developers/library/overview/opencl_overview.pdf• http://www.gdhpress.com.br/blog/opencl/• http://www.guiadohardware.net/noticias/2008-12/493F5D72.html• http://www.guiadohardware.net/noticias/2010-06/opencl.html• http://pt.wikipedia.org/wiki/OpenCL• http://developer.nvidia.com/object/opencl.html• http://developer.download.nvidia.com/OpenCL/NVIDIA_OpenCL_JumpStart_Guide.pdf• http://www.nvidia.com/object/cuda_opencl_new.html• http://www.nvidia.com.br/object/cuda_opencl_br.html• http://images.apple.com/br/macosx/technology/docs/OpenCL_TB_brief_20090608.pdf
Top Related