Programação Paralela em OpenCL

Slides:



Advertisements
Apresentações semelhantes
Sistemas Operacionais
Advertisements

C/C++ para Sistemas Operacionais Professor: André Luis Meneses Silva /msn: Página:
Sistemas operacionais
OpenMP.
LEIC/FEUP Tecnologia de Sistemas de Gestão de Bases de Dados
MPI - Introdução Message-Passing Model Task: código + memória (uma ou várias tasks no mesmo processador) Mensagem: as tasks comunicação entre si trocando.
Programação Básica em Java
OpenMP MO801/MC972. Visão geral Biblioteca de mais alto nível para programação paralela Prevê memória compartilhada Requer suporte do compilador Exige.
Padrão MPI – Message Passing Interface
1 Tipos definidos O programador pode definir seus próprios tipos de dados tipos complexos usados da mesma forma que os simples declaram-se variáveis utilizando-se.
Sistemas Operacionais
GPGPU.
Threads Estagiário: Bruno Guazzelli Batista Slides de autoria do Prof Drº Marcos José Santana baseados no livro Sistemas Operacionais Modernos de A. Tanenbaum.
SSC SISTEMAS OPERACIONAIS I
SSC SISTEMAS OPERACIONAIS I
Modificadores de tipos e Arquivos
Linguagens de programação
Linguagem C LPG-I – Variáveis Estruturadas – Vetores
LPG - I: Alocação Dinâmica de Memória - Ponteiros
LINGUAGEM ESTRUTURADA TURBO C
1 COS 773- SISTEMAS OPERACIONAIS Prof: Vitor BLOCK I/O Cristiane Magalhães.
Armazenamento de Dados em Arquivos
Threads.
Escola Secundária c/ 3º CEB da Batalha
Tratamento de Ficheiros
Computação Gráfica Desempenho.
Revisão da Linguagem C.
APRESENTAÇÃO: GIANCARLO DE GUSMÃO GONÇALVES CURSO DE C AULA 08: Tipos Estruturados.
Prof. André Leon S. Gradvohl, Dr.
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Aula prática 9 Alocação Dinâmica Monitoria de Introdução à Programação
Curso de Nivelamento LCG
INPE / CAP-315 Airam J. Preto, Celso L. Mendes Aula 27 (1) Programação com MPI Tópicos: Modelo de Programação Funções de Ambiente Funções Básicas.
METODOLOGIA PARA DESENVOLVIMENTO DE SISTEMAS Prof. Dr. rer. nat. Daniel D. Abdala 1.
Estruturas de Dados com Jogos
CUDA vs OpenCL Introdução.
Introdução a GPGPU CUDA: arquitetura de computação paralela para GPGPU.
Fundamentos de programação CUDA
Faculdade de Computação Universidade Federal de Mato Grosso do Sul
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Tópicos em redes e sistemas distribuídos Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
César L. B. Silveira Prof. Dr. Luiz G. da Silveira Jr.
Paradigmas e Ferramentas de Desenvolvimento de Software – Revisão da linguagem C++ Lúbia Vinhas DPI - INPE.
Introdução à Programação Orientada a Objetos com Java Paulo Borba Centro de Informática Universidade Federal de Pernambuco Programação Imperativa (e Ponteiros.
Computação de Alto Desempenho Utilizando Placas Gráficas Divino César S. Lucas Universidade Católica de Goiás
Banco de Dados Parte 04 Ceça. Ceça Moraes 2 Conteúdo  Os três níveis da arquitetura  Mapeamentos  Arquitetura cliente-servidor.
Sistemas Operacionais
Universidade Federal do Pará Instituto de Ciências Exatas e Naturais Faculdade de Computação SISTEMAS OPERACIONAIS Aula 9 Regiane Kawasaki
Linguagem de programação I A Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Uma Análise das plataformas CUDA e OpenCL usando MetaHeurísticas aplicadas no Problema do Caixeiro Viajante Aluno: Hedley Luna Gois Oriá Disciplina: Introdução.
Tratamento de ficheiros Abrir e fechar um ficheiro.
Go3D! A 3D Graphics Engine Carlos Tosin. Divisão Estrutura dividida em 4 componentes Core (46 classes) Áudio (4 classes) Script (4 classes) Renderer (37.
1 Alocação Dinâmica Quando se declara arrays o tamanho deve ser fixo e definido primeiramente –Alocação estática Pode-se alocar dinamicamente o espaço.
MSc. Marcelo Torres – professortorres.com.br. Linguagem de Programação 01 - Introdução à Linguagem C MSc. Marcelo Torres – professortorres.com.br.
Estruturas de Dados Aula 7: Tipos Estruturados 23/04/2014.
Sistemas Distribuídos
Subsistema de Entrada e Saída do Kernel
Perspectivas NVidia para Desktop Tiago Carneiro Pessoa
Pedro Leite Agenda Introdução Buffers Listener Sources Modelos de Distância Demo Conclusão Referências.
Programação Paralela em Ambientes Computacionais Heterogêneos com OpenCL César L. B. Silveira Prof. Dr. Luiz G. da Silveira Jr. Prof. Dr. Gerson Geraldo.
Linguagem de Programação
Paradigmas de Processamento Paralelo na Resolução do Fractal de Mandelbrot Bruno Pereira dos Santos Dany Sanchez Dominguez Universidade Estadual de Santa.
Programação II Arquivos Autoria: Ernani Santos Modificação: Clebson Oliveira Adaptação: Claudia Boeres.
Anderson Braga de Avila 1.  Usar todos os recursos computacionais no sistema — CPUs, GPUs e outros processadores  Modelo de programação paralela eficiente.
OpenCL Eliane Siegert. Estrutura – Princípio Geral de Funcionamento – Exemplos de Aplicações – Modelo de Programação – Linguagens Suportadas – Exemplos.
Programação em OpenCL Uma introdução prática
Introdução a GPU e CUDA.
Programação em OpenCL Uma introdução prática
Programação em OpenCL Uma introdução prática
Transcrição da apresentação:

Programação Paralela em OpenCL César L. B. Silveira cesar@v3d.com.br 19 de novembro de 2010

Introdução Open Computing Language (OpenCL) Padrão aberto, livre de royalties, para programação paralela em ambientes heterogêneos Ambientes heterogêneos CPUs multicore, GPUs many-core Framework Arquitetura Linguagem API

Introdução Neste tutorial... Conceitos da arquitetura OpenCL Breve visão da linguagem OpenCL C APIs fundamentais para o desenvolvimento Exemplo completo de aplicação Integração com OpenGL

Hello World Código sequencial void ArrayDiff(const int* a, const int* b, int* c, int n) { for (int i = 0; i < n; ++i) c[i] = a[i] - b[i]; }

Hello World Código OpenCL (kernel) __kernel void ArrayDiff(__global const int* a, __global const int* b, __global int* c) { int id = get_global_id(0); c[id] = a[id] - b[id]; }

Aplicações OpenCL Camadas de uma aplicação OpenCL

Arquitetura OpenCL Arquitetura abstrata de baixo nível Implementações mapeiam para entidades físicas Quatro modelos Plataforma Execução Programação Memória

Arquitetura OpenCL Modelo de plataforma Descreve entidades do ambiente OpenCL

Arquitetura OpenCL ... Hospedeiro ... ... Modelo de Plataforma Dispositivo ... Unidade de Computação ... Elemento de Processamento ... Modelo de Plataforma

Arquitetura OpenCL Exemplo: GPU NVIDIA GPU: dispositivo Streaming Multiprocessor: unidade de computação Processor/Core: elemento de processamento

Arquitetura OpenCL Modelo de execução Descreve instanciação e identificação de kernels

Arquitetura OpenCL Modelo de execução Espaços de índices 2D 3D 1D

Modelo de execução: itens e grupos de trabalho Arquitetura OpenCL Grupo de trabalho (work-group) Item de trabalho (work-item) Modelo de execução: itens e grupos de trabalho

Arquitetura OpenCL Item de trabalho Kernel Instância __kernel void f(...) { ... Kernel

Modelo de execução: identificadores Arquitetura OpenCL 1 Grupo de trabalho: (1, 0) Modelo de execução: identificadores

Modelo de execução: identificadores Arquitetura OpenCL 1 3 2 1 Item de trabalho: (1, 2) Identificador global 2 Modelo de execução: identificadores

Modelo de execução: identificadores Arquitetura OpenCL Item de trabalho: (1, 0) 1 1 Identificador local Modelo de execução: identificadores

Modelo de execução: objetos Arquitetura OpenCL Contexto mem Filas de comandos Dispositivos Kernels Objetos de memória Objetos de programa Modelo de execução: objetos

Arquitetura OpenCL Modelo de execução: objetos Toda comunicação com um dispositivo é feita através da sua fila de comandos Objetos de memória Buffers: acesso direto via ponteiros Images: acesso especial via samplers

Arquitetura OpenCL Modelo de programação Paralelismo de dados (data parallel): múltiplos itens de trabalho para um kernel Paralelismo de tarefas (task parallel): um item de trabalho para um kernel

Arquitetura OpenCL Modelo de memória Descreve uma hierarquia de memória e o compartilhamento de cada nível entre itens e grupos de trabalho

Arquitetura OpenCL Memória privada Modelo de memória - Exclusiva de cada item de trabalho - Leitura e Escrita Modelo de memória

Arquitetura OpenCL Memória local Modelo de memória - Compartilhada pelo grupo de trabalho - Leitura e Escrita Modelo de memória

Arquitetura OpenCL Memória global Modelo de memória - Compartilhada por todos os itens de trabalho - Leitura e Escrita Modelo de memória

Arquitetura OpenCL Memória constante Modelo de memória - Compartilhada por todos os itens de trabalho - Somente leitura Modelo de memória

Arquitetura OpenCL Modelo de memória: consistência Um item de trabalho lê corretamente o que outros escrevem?

Modelo de memória: consistência Arquitetura OpenCL - Memória é consistente para um item de trabalho x x Item de trabalho Memória Modelo de memória: consistência

Modelo de memória: consistência Arquitetura OpenCL - Memória é consistente para um grupo de trabalho após uma barreira (barrier) x y ? Itens de trabalho Memória Modelo de memória: consistência

Modelo de memória: consistência Arquitetura OpenCL - Memória é consistente para um grupo de trabalho após uma barreira (barrier) x y Itens de trabalho Memória Modelo de memória: consistência

Modelo de memória: consistência Arquitetura OpenCL - Memória é consistente para um grupo de trabalho após uma barreira (barrier) barrier() Itens de trabalho Memória Modelo de memória: consistência

Modelo de memória: consistência Arquitetura OpenCL - Memória é consistente para um grupo de trabalho após uma barreira (barrier) y x Itens de trabalho Memória Modelo de memória: consistência

Arquitetura OpenCL Sincronização Barreira: execução só prossegue após todos os itens de trabalho de um mesmo grupo de trabalho a terem atingido Não há sincronização entre grupos de trabalho

Linguagem OpenCL C Utilizada para a escrita de kernels Baseada no padrão C99 Acrescenta extensões e restrições

Linguagem OpenCL C Extensão: tipos vetoriais Notação: tipo[# de componentes] 1, 2, 4, 8 ou 16 componentes Exemplos: float4 int8 short2 uchar16

Linguagem OpenCL C Operações com tipos vetoriais Entre vetores de mesmo número de componentes Entre vetores e escalares float4 v = (float4)(1.0, 2.0, 3.0, 4.0); float4 u = (float4)(1.0, 1.0, 1.0, 1.0); float4 v2 = v * 2; float4 t = v + u;

Linguagem OpenCL C Definição de kernels Qualificador __kernel Todo kernel deve ser void __kernel void f(…) { ... }

Linguagem OpenCL C Qualificadores de espaço de endereçamento Definem nível da memória apontada por um ponteiro __global, __local, __private e __const Default: __private

Linguagem OpenCL C Restrições Ponteiros para função não são suportados Funções e macros com número variável de argumentos não são suportados Qualificadores extern, static e auto não são suportados Não há suporte a recursão

API de suporte: kernels Funções de identificação Informações sobre espaço de índices, item e grupo de trabalho get_global_id(uint dimindx) get_local_id(uint dimindx) get_group_id(uint dimindx) get_global_size(uint dimindx) get_local_size(uint dimindx) get_num_groups() get_work_dim()

API de suporte: kernels Funções de sincronização barrier(cl_mem_fence_flags flags) Flags: CLK_LOCAL_MEM_FENCE CLK_GLOBAL_MEM_FENCE

API de suporte: hospedeiro Ilustração através de um exemplo prático Aplicação completa Kernel para subtração dos elementos de dois arrays

Exemplo prático Exemplo de código executado no hospedeiro Ilustra as principais etapas para o desenvolvimento de soluções OpenCL Multi-plataforma

Exemplo prático #ifdef __APPLE__ #include <OpenCL/opencl.h> #else #include <CL/opencl.h> #endif

Exemplo prático cl_platform_id platformId; cl_device_id deviceId; clGetPlatformIDs(1, &platformId, NULL); clGetDeviceIDs( platformId, CL_DEVICE_TYPE_GPU, 1, &deviceId, NULL);

Exemplo prático cl_context context = clCreateContext( NULL, 1, &deviceId, NULL, NULL, NULL); cl_command_queue queue = clCreateCommandQueue( context, deviceId, NULL, NULL);

Exemplo prático const char* source = "__kernel void ArrayDiff( \ __global const int* a, \ __global const int* b, \ __global int* c) \ { \ int id = get_global_id(0);\ c[id] = a[id] - b[id]; \ }";

Exemplo prático cl_program program = clCreateProgramWithSource( context, 1, &source, NULL, NULL);

Exemplo prático clBuildProgram( program, 0, NULL, NULL, NULL, NULL); cl_kernel kernel = clCreateKernel( program,"ArrayDiff", NULL);

Exemplo prático #define N ... cl_mem bufA = clCreateBuffer( context, CL_MEM_READ_ONLY, N * sizeof(int), NULL, NULL); cl_mem bufB = ...; cl_mem bufC = ...; CL_MEM_READ_WRITE

Exemplo prático int* hostA; clEnqueueWriteBuffer( queue, bufA, CL_TRUE, 0, N * sizeof(int), hostA, 0, NULL, NULL);

Exemplo prático int* hostB; clEnqueueWriteBuffer( queue, bufB, CL_TRUE, 0, N * sizeof(int), hostB, 0, NULL, NULL);

Exemplo prático clSetKernelArg( kernel, 0, sizeof(cl_mem), &bufA); kernel, 1, sizeof(cl_mem), &bufB); kernel, 2, sizeof(cl_mem), &bufC);

Exemplo prático const size_t globalSize[] = { N }; clEnqueueNDRangeKernel( queue, kernel, 1, NULL, globalSize, NULL, 0, NULL, NULL); clFinish(queue);

Exemplo prático int* hostC; clEnqueueReadBuffer( queue, bufC, CL_TRUE, 0, N * sizeof(int), hostC, 0, NULL, NULL);

Exemplo prático clReleaseMemObject(bufC); clReleaseMemObject(bufB); clReleaseMemObject(bufA); clReleaseKernel(kernel); clReleaseProgram(program); clReleaseCommandQueue(queue); clReleaseContext(context);

Interoperação com OpenGL Em GPUs, é possível compartilhar estruturas entre OpenCL e OpenGL Exemplo prático: malha tridimensional Vértices posicionados via OpenCL Exibição via OpenGL Compartilhamento de Vertex Buffer Object (VBO) OpenCL: array de float4

Interoperação com OpenGL Demonstração

Interoperação com OpenGL __kernel void sine_wave( __global float4* pos, unsigned int width, unsigned int height, float time) { unsigned int x = get_global_id(0); unsigned int y = get_global_id(1); Kernel

Interoperação com OpenGL float u = x / (float) width; float v = y / (float) height; u = u*2.0f - 1.0f; v = v*2.0f - 1.0f; float freq = 4.0f; float w = sin(u * freq + time) * cos(v * freq + time) * 0.5f; pos[y * width + x] = (float4)(u, w, v, 1.0f); }

cl_context_properties props[] = { CL_GL_CONTEXT_KHR, (cl_context_properties) wglGetCurrentContext(), CL_WGL_HDC_KHR, (cl_context_properties) wglGetCurrentDC(), CL_CONTEXT_PLATFORM, (cl_context_properties) platformId, 0 }; context = clCreateContext( props, 1, &deviceId, NULL, NULL, NULL); Criação do contexto

Interoperação com OpenGL #define BUFFER_SIZE ... GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData( GL_ARRAY_BUFFER, BUFFER_SIZE, 0, GL_DYNAMIC_DRAW); Criação do VBO

Interoperação com OpenGL cl_mem vbo_cl; vbo_cl = clCreateFromGLBuffer( context, CL_MEM_WRITE_ONLY, vbo, NULL); Criação do objeto de memória a partir do VBO

Interoperação com OpenGL clEnqueueAcquireGLObjects( queue, 1, &vbo_cl, NULL, NULL); Aquisição do VBO

Interoperação com OpenGL size_t globalSize[] = { MESH_WIDTH, MESH_HEIGHT }; clEnqueueNDRangeKernel( queue, kernel, 2, NULL, globalSize, NULL, 0, 0, 0); clFinish(queue); Execução do kernel

Interoperação com OpenGL clEnqueueReleaseGLObjects( queue, 1, &vbo_cl, NULL, NULL); Liberação do VBO

Considerações finais SDKs NVIDIA CUDA SDK ATI Streaming SDK Intel OpenCL SDK (alpha) Aplicações em jogos: IA, física, simulações diversas

Considerações finais Material disponível em http://labs.v3d.com.br/

Dúvidas?