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



Documentos relacionados
Programação Paralela em OpenCL

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

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

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

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

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

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

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

Point Based Graphics e Aplicações em Jogos

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

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

Orientação a Objetos com Java

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

Programação Paralela Híbrida em CPU e GPU: Uma Alternativa na Busca por Desempenho

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

PROGRAMA DE DISCIPLINA

clopencl - OpenCL para ambiente cluster

Infra-Estrutura de Software. Introdução. (cont.)

Java. Marcio de Carvalho Victorino

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

Tipos de Dados, Tipos Abstratos de Dados Estruturas de Dados

Introdução aos Sistemas Operativos

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

Introdução à Arquitetura de Computadores

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

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

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

Conceito de classe em C++

ESTUDO DE CASO WINDOWS VISTA

Sistemas Operacionais I

PROGRAMA DE DISCIPLINA

Auditoria de senhas em hardware paralelo com o John the Ripper O impacto das tecnologias de processamento paralelo na quebra de senhas

UNIVERSIDADE PRESBITERIANA MACKENZIE FACULDADE DE COMPUTAÇÃO E INFORMÁTICA

Introdução à Linguagem Java

Introdução. O que vimos. Infraestrutura de Software. (cont.) História dos Sistemas Operacionais. O que vimos 12/03/2012. Primeira geração:

C++ ao resgate! Acelerando apps Android com instruções SIMD. Carlos Rafael Gimenes das Neves

Multi-processamento. Arquitecturas MIMD de memória partilhada Multi-cores heterogéneos Multi-processadores

TDC desenvolvimento. para iphone. Helder da Rocha

Capítulo 8 Arquitetura de Computadores Paralelos

SIMULADOR DE ROTEAMENTO DE PACOTES (V. 3 20/05/2010)

MC102 Algoritmos e Programação de Computadores 1ª Aula Introdução à Programação de Computadores

Sistemas Distribuídos

Linguagem de Programação Introdução a Linguagem Java

Oracle Grid Engine. Thiago Marques Soares. Pós-Graduação em Modelagem Computacional Universidade Federal de Juiz de Fora. 8 de abril de 2015

Sistemas Operacionais Gerência de Dispositivos

OpenGL Shading Language

Minicurso Computação em Nuvem Prática: Openstack

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

Programação em Paralelo OpenMP

Alocação dinâmica de memória

Ferramenta de apoio a gerência de configuração de software. Aluno: Rodrigo Furlaneto Orientador: Everaldo Artur Grahl

Persistência de Dados

CURSO DE PROGRAMAÇÃO EM JAVA

Sistemas Operacionais

Programação Estruturada I

Algoritmos e Programação Estruturada

Estrutura, Processos e Threads

Estrutura de um Computador

Orientação a Objetos

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

DAS5102 Fundamentos da Estrutura da Informação

Introdução. Sistemas Operacionais

DESENVOLVIMENTO DE UM APLICATIVO DO TIPO SECRETÁRIO VIRTUAL PARA A PLATAFORMA ANDROID

CURSO BÁSICO DE PROGRAMAÇÃO AULA 8. Introdução ao Linux Introdução a linguagem C

Arquitetura de Banco de Dados

Linguagem de Programação III

Processos e Threads (partes I e II)

Resumo até aqui. Gerenciamento Proteção Compartilhamento. Infra-estrutura de Software

Aula 1. // exemplo1.cpp /* Incluímos a biblioteca C++ padrão de entrada e saída */ #include <iostream>

Redes. Pablo Rodriguez de Almeida Gross

Figura 01 Kernel de um Sistema Operacional


Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

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

LP II Estrutura de Dados. Introdução e Linguagem C. Prof. José Honorato F. Nunes honorato.nunes@ifbaiano.bonfim.edu.br

Exercício 1. Tabela 1: Cadastro de usuários, senhas e privilégios (exemplo). Login Senha Privilégio Armamento

OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora

Plugins TerraView. Última revisão: 12/12/32006 Versão TerraLib: 3.1.4

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

Capítulo 2. Charm++ 16

Aula 10 - Streams (Parte I)

Algoritmos e Programação _ Departamento de Informática

Java Threads. Introdução

Bancos de dados distribuídos Prof. Tiago Eugenio de Melo


Sistemas Operacionais Aula 06: Threads. Ezequiel R. Zorzal

MC-102 Aula 01. Instituto de Computação Unicamp

Padrões Arquiteturais. Sistemas Distribuídos: Broker

17 - Funções e Procedimentos em C Programação Modular

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

COMPUTAÇÃO PARALELA. uma visão geral. Guilherme Galante. v.2.0

Transcrição:

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 H. Cavalheiro 28 de outubro de 2010

contato@v3d.com.br cesar@v3d.com.br

Introdução Ambientes computacionais atuais: CPUs e GPUs Ambientes heterogêneos CPUs mul$core e GPUs many- core Processamento paralelo Alto desempenho Como uolizar todo este poder computacional?

Introdução Programação paralela CPUs Mul$threading MúlOplos processos GPUs APIs gráficas (OpenGL, DirectX) Shaders Tecnologias proprietárias NVIDIA CUDA AMD Streaming SDK

Introdução Problema: múloplas ferramentas e paradigmas Alto custo de implementação Aplicações dependentes de plataforma Necessidade de um padrão para programação paralela

Introdução Open CompuOng Language (OpenCL) Padrão aberto, livre de royal$es, para programação paralela em ambientes heterogêneos ManOdo pelo Khronos Group desde 2008 Define framework Arquitetura Linguagem API

Introdução Camadas de uma aplicação OpenCL

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]; }

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

Arquitetura OpenCL Modelo de plataforma EnOdades do ambiente OpenCL Hospedeiro (host) Agrega disposi/vos (devices) que suportam o padrão Coordena execução DisposiOvo (device) Composto de unidades de computação (compute units)

Arquitetura OpenCL Modelo de plataforma Unidade de computação Composta de elementos de processamento (processing elements) Elemento de processamento Realiza computação

Arquitetura OpenCL

Arquitetura OpenCL Modelo de execução Descreve instanciação e idenoficação de kernels Espaço de índices (NDRange) Até 3 dimensões Itens de trabalho (work- items) organizados em grupos de trabalho (work- groups)

Arquitetura OpenCL Modelo de execução Item de trabalho Instância de um kernel Grupo de trabalho Permite sincronização entre itens de trabalho

Arquitetura OpenCL Modelo de execução: idenoficação Item de trabalho IdenOficadores globais no espaço de índices IdenOficadores locais no grupo de trabalho Grupo de trabalho IdenOficadores no espaço de índices Um iden/ficador por dimensão do espaço de índices

Arquitetura OpenCL

Arquitetura OpenCL Modelo de execução: objetos Contexto (context): agrega disposiovos, kernels e outras estruturas Fila de comandos (command queue): comandos para um disposiovo Comandos de I/O para memória, execução de kernels, sincronização e outros

Arquitetura OpenCL Modelo de execução: objetos Objeto de programa (program object): encapsula código de um ou mais kernels Base para compilação de kernels Objeto de memória (memory object): comunicação com a memória dos disposiovos Buffers: acesso direto (ponteiros) Images: acesso especial via samplers, texturas

Arquitetura OpenCL Modelo de execução Relacionado com modelo de plataforma Item de trabalho: elemento de processamento Grupo de trabalho: unidade de computação

Arquitetura OpenCL Modelo de programação Paralelismo de dados (data parallel): múloplos itens de trabalho para um kernel Paralelismo de tarefas (task parallel): um item de trabalho para um kernel Execução paralela de tarefas disontas ÚOl quando há muito overhead de I/O entre hospedeiro e disposiovo

Arquitetura OpenCL Modelo de memória Memória global (global memory) ComparOlhada entre todos itens de trabalho do espaço de índices Escrita e leitura Memória local (local memory) ComparOlhada apenas entre itens de trabalho do mesmo grupo de trabalho Escrita e leitura

Arquitetura OpenCL Modelo de memória Memória privada (private memory) Exclusiva de cada item de trabalho Escrita e leitura Memória constante (constant memory) ComparOlhada entre todos itens de trabalho do espaço de índices Somente leitura

Arquitetura OpenCL

Arquitetura OpenCL Modelo de memória: consistência Um item de trabalho lê corretamente o que outros escrevem? Memória é consistente para: Um único item de trabalho Grupo de trabalho em uma barreira (sincronização)

Arquitetura OpenCL Item de trabalho: memória consistente

Arquitetura OpenCL Grupo de trabalho: memória consistente após barreira (barrier)

Arquitetura OpenCL Modelo de memória: consistência Não há sincronização entre grupos de trabalho

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

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

Linguagem OpenCL C Operações com Opos 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 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 Em um kernel, todo argumento ponteiro deve estar acompanhado de um qualificador

Linguagem OpenCL C Restrições Ponteiros para função não são suportados Argumentos para kernels não podem ser ponteiros para ponteiros 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

Linguagem OpenCL C Restrições Não há suporte a recursão Elementos de structs e unions devem pertencer ao mesmo espaço de endereçamento Cabeçalhos padrão (stdio.h, stdlib.h, etc.) não estão presentes

API de suporte: kernels Funções de idenoficaçã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: kernels Sincronização kernel void akernel( global float* in, global float* out) { int gid = get_global_id(0); int lid = get_local_id(0); int lsize = get_local_size(0); local float a[lsize];

API de suporte: kernels a[lid] = in[gid]; barrier(clk_local_mem_fence); out[gid] = a[(lid + 4) % lsize] * 2; } barrier(clk_global_mem_fence);

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

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

Exemplo práoco Etapas Aquisição do disposiovo (GPU) Criação do contexto Compilação do kernel Criação dos buffers para entrada e saída Escrita dos dados de entrada Execução do kernel Leitura dos dados de saída Liberação de recursos

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

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

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

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

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

Exemplo práoco #define N cl_mem bufa = clcreatebuffer( context, CL_MEM_READ_ONLY, N * sizeof(int), NULL, NULL); cl_mem bufb = ; cl_mem bufc = ;

Exemplo práoco int* hosta; clenqueuewritebuffer( queue, bufa, CL_TRUE, 0, N * sizeof(int), hosta, 0, NULL, NULL);

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

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

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

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

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

Exemplo práoco Compilação Instalar toolkit de desenvolvimento Por exemplo, NVIDIA CUDA ou ATI Streaming SDK Linux: gcc -I/usr/local/cuda/include hello.c -o hello lopencl

Exemplo: filtro de imagem

Exemplo: filtro de imagem kernel void Blur( global const int* in, global int* out) { int x = get_global_id(0); int y = get_global_id(1); int width = get_global_size(0); int height = get_global_size(1);

Exemplo: filtro de imagem if (x == 0 x == width - 1 y == 0 y == height - 1) { out[y * width + x] = in[y * width + x]; }

Exemplo: filtro de imagem else { int sum = 0; for (int i = -1; i <= 1; ++i) for (int j = -1; j <= 1; ++j) sum += in[(y + i) * width + (x + j)]; } } out[y * width + x] = sum / 9;

Exemplo: filtro de imagem OpenCL permite o foco na solução de uma unidade do problema Run$me é responsável pela criação dos itens de trabalho e divisão das tarefas

Comparações com outras tecnologias OpenMP Necessidade de explicitar loops e comparolhamento de variáveis Apenas CPU Interface naova para threads Gerência manual de threads Apenas CPU

Comparações com outras tecnologias NVIDIA CUDA Específico de plataforma Apenas GPU

Considerações finais NVIDIA e ATI suportam ATI adotou OpenCL como linguagem oficial do Streaming SDK ImaginaOon: rumores de suporte a OpenCL em futuros iphones

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

Dúvidas?