Programação Paralela em OpenCL



Documentos relacionados
Programação Paralela em Ambientes Computacionais Heterogêneos com OpenCL

Programação Paralela em Ambientes Computacionais Heterogêneos com OpenCL

Programação introdutória em OpenCL e aplicações em realidade virtual e aumentada

Programação em OpenCL: Uma introdução prática

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 13/11/2017 ALUNO

Paralelismo de dados. (execução de simultaneidade) Tipo de arquitetura paralela SIMD. SIMD (Single Instruction Multiple Data)

clopencl - OpenCL para ambiente cluster

Point Based Graphics e Aplicações em Jogos

Computação Heterogênea Programação paralela, clusters e GPUs

Programando em C++ Histórico da Linguagem C

Programação Estruturada I

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Processamento de Alto Desempenho utilizando Unidade de Processamento Gráfico - GPU

Conversão de Tipos e Arrays

Linguagem C Funções definidas pelo usuário. Lógica de Programação

Tipo de Dados em Linguagem C

LTP-IV. Prof. Dr. Silvio do Lago Pereira. Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Arquitetura e Programação de GPU. Leandro Zanotto RA: Anselmo Ferreira RA: Marcelo Matsumoto RA:

UNIVERSIDADE DO TOCANTINS TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS PRÁTICA EM PROGRAMAÇÃO DE SISTEMAS ESTUDO DE CASO I

INF 1007 Programação II

O COMPUTADOR. Introdução à Computação

cast poderia ser usado também para transformar um real (float) em inteiro. A sintaxe C (float)i pode ser substituída em C++ por float(i).

Programação. MEAer. Bertinho Andrade da Costa. Instituto Superior Técnico. Introdução ao Pré-Processador. 2011/2012 1º Semestre

Linguagem C: variáveis, operadores, entrada/saída. Prof. Críston Algoritmos e Programação

UNIVERSIDADE FEDERAL DO ESPÍRITO SANTO CENTRO UNIVERSITÁRIO NORTE DO ESPÍRITO SANTO

Linguagens de Programação

Comparação de eficiência entre OpenCL e CUDA

Como o FIT funciona. FIT: Framework for Integrated Tests FIT. Dados de testes. Programa. Fixtures. classes. Resultados de testes

Filas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

INE 5645 PROGRAMAÇÃO PARALELA E DISTRIBUIDA PROVA 2 03/07/2017 ALUNO

Algoritmos e Programação

Estrutura Condicional C++

Programação Paralela com Troca de Mensagens. Profa Andréa Schwertner Charão DLSC/CT/UFSM

Linguagem C. TGSI Lógica de Programação / Linguagem C Prof. Marcos Roberto

7. Estrutura de Decisão

Edison Gustavo Muenz. Estudo e implementação de um algoritmo de processamento de imagens com técnicas GPGPU

Introdução a CUDA. Esteban Walter Gonzalez Clua. Medialab - Instituto de Computação Universidade Federal Fluminense NVIDIA CUDA Research Center START

Universidade da Beira Interior Cursos: Matemática /Informática e Ensino da Informática

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

Waldemar Celes. 25 de Agosto de 2014

Algoritmo e Técnica de Programação - Linguagem C

ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

9 Comandos condicionais

PARALELIZAÇÃO DE APLICAÇÕES NA ARQUITETURA CUDA: UM ESTUDO SOBRE VETORES 1

Linguagem de Programação C

UNIVERSIDADE FEDERAL DO RIO GRANDE DO SUL INSTITUTO DE INFORMÁTICA INFORMÁTICA APLICADA

Variáveis e Comandos de Atribuição

Programação Orientada a Objetos C++

Introdução à Engenharia ENG1000

Módulo 02 Programação Orientada a Objetos. Última atualização: 07/06/2010

Análise de Programação

Aula 10 - Streams (Parte I)

Listas (Parte 2) Túlio Toffolo BCC202 Aula 10 Algoritmos e Estruturas de Dados I

Programação de Computadores - I. Profª Beatriz Profº Israel

Linguagem C. Programação Estruturada. Fundamentos da Linguagem. Prof. Luis Nícolas de Amorim Trigo

IFTO LÓGICA DE PROGRAMAÇÃO AULA 05

Manual do Usuário - JIDOSHA

Estrutura switch if-else switch switch switch if-else-if switch switch case default break switch switch break Observações: case

Princípios de programação em Linguagem C++

INTRODUÇÃO A OPENGL. Computação Gráfica

Universidade Federal de Pernambuco Centro de Informática. Aluno: Anderson L. S. Moreira Orientador: Paulo R. R.

Elementos de programação em C

Pilhas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

OpenCL-MMP Codificação de Imagens com Sistemas com Múltiplos Núcleos

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

insfcanceof new public switch transient while byte continue extends for int null

Programação em Paralelo OpenMP

ÇÃO COM OBJECTOS PROGRAMAÇÃ. Programação com Objectos. Programação com Objectos TUDO É UM OBJECTO TUDO É UM OBJECTO ÍNDICE.

Desenvolvimento OO com Java Orientação a objetos básica

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Tipos de Dado Abstrato: Listas, Filas e Pilhas

2. Constantes e Variáveis

UML: Diagrama de Casos de Uso, Diagrama de Classes

Java Threads. Introdução

Exercícios de Revisão Java Básico

Programação com Posix Threads

OpenGL Shading Language

Mochila Binária com OpenMP

Introdução à Programação com Classes em C++

Trabalho 3: Agenda de Tarefas

Sistemas Operacionais

Programação Paralela e Distribuída (DCC/UFRJ)

5 Apresentando a linguagem C

Transcrição:

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

Introdução Open CompuDng Language (OpenCL) Padrão aberto, livre de royal&es, para programação paralela em ambientes heterogêneos Ambientes heterogêneos CPUs mul&core, 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 enddades Ysicas Quatro modelos Plataforma Execução Programação Memória

Arquitetura OpenCL Modelo de plataforma Descreve enddades do ambiente OpenCL

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

Arquitetura OpenCL Exemplo: GPU NVIDIA GPU: disposidvo Streaming Mul&processor: unidade de computação Processor/Core: elemento de processamento

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

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

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

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

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

Arquitetura OpenCL 0 1 2 3 Item de trabalho: (1, 2) 0 1 2 IdenDficador global 3 Modelo de execução: idendficadores

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

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

Arquitetura OpenCL Modelo de execução: objetos Toda comunicação com um disposidvo é 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úldplos 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 compardlhamento de cada nível entre itens e grupos de trabalho

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

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

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

Arquitetura OpenCL Memória constante - ComparDlhada 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?

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

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

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

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

Arquitetura OpenCL - Memória é consistente para um grupo de trabalho após uma barreira (barrier) y Itens de trabalho x 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 adngido Não há sincronização entre grupos de trabalho

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

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

Linguagem OpenCL C Operações com Dpos 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 idendficaçã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ádco Aplicação completa Kernel para subtração dos elementos de dois arrays

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

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

Exemplo prádco cl_platform_id platformid; cl_device_id deviceid; clgetplatformids(1, &platformid, NULL); clgetdeviceids( platformid, CL_DEVICE_TYPE_GPU, 1, &deviceid, NULL);

Exemplo prádco cl_context context = clcreatecontext( NULL, 1, &deviceid, NULL, NULL, NULL); cl_command_queue queue = clcreatecommandqueue( context, deviceid, NULL, NULL);

Exemplo prádco 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ádco cl_program program = clcreateprogramwithsource( context, 1, &source, NULL, NULL);

Exemplo prádco clbuildprogram( program, 0, NULL, NULL, NULL, NULL); cl_kernel kernel = clcreatekernel( program,"arraydiff", NULL);

Exemplo prádco #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ádco int* hosta; clenqueuewritebuffer( queue, bufa, CL_TRUE, 0, N * sizeof(int), hosta, 0, NULL, NULL);

Exemplo prádco int* hostb; clenqueuewritebuffer( queue, bufb, CL_TRUE, 0, N * sizeof(int), hostb, 0, NULL, NULL);

Exemplo prádco clsetkernelarg( kernel, 0, sizeof(cl_mem), &bufa); clsetkernelarg( kernel, 1, sizeof(cl_mem), &bufb); clsetkernelarg( kernel, 2, sizeof(cl_mem), &bufc);

Exemplo prádco const size_t globalsize[] = { N }; clenqueuendrangekernel( queue, kernel, 1, NULL, globalsize, NULL, 0, NULL, NULL); clfinish(queue);

Exemplo prádco int* hostc; clenqueuereadbuffer( queue, bufc, CL_TRUE, 0, N * sizeof(int), hostc, 0, NULL, NULL);

Exemplo prádco clreleasememobject(bufc); clreleasememobject(bufb); clreleasememobject(bufa); clreleasekernel(kernel); clreleaseprogram(program); clreleasecommandqueue(queue); clreleasecontext(context);

Interoperação com OpenGL Em GPUs, é possível compardlhar estruturas entre OpenCL e OpenGL Exemplo prádco: malha tridimensional VérDces posicionados via OpenCL Exibição via OpenGL ComparDlhamento 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) Kernel unsigned int x = get_global_id(0); unsigned int y = get_global_id(1);

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( Criação do contexto props, 1, &deviceid, NULL, NULL, NULL);

Interoperação com OpenGL #define BUFFER_SIZE... GLuint vbo; Criação do VBO glgenbuffers(1, &vbo); glbindbuffer(gl_array_buffer, vbo); glbufferdata( GL_ARRAY_BUFFER, BUFFER_SIZE, 0, GL_DYNAMIC_DRAW);

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 pardr do VBO

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

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, Liberação do VBO NULL, NULL, NULL);

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

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

Dúvidas?