programação paralela em opencl

Download Programação Paralela em OpenCL

Post on 25-Jan-2016

27 views

Category:

Documents

0 download

Embed Size (px)

DESCRIPTION

Programao Paralela em OpenCL. Csar L. B. Silveira cesar@v3d.com.br 19 de novembro de 2010. Introduo. Open Computing Language ( OpenCL ) Padro aberto , livre de royalties , para programao paralela em ambientes heterogneos Ambientes heterogneos - PowerPoint PPT Presentation

TRANSCRIPT

Open Computing Language

Programao Paralela em OpenCL

Csar L. B. Silveiracesar@v3d.com.br

19 de novembro de 20101IntroduoOpen Computing Language (OpenCL)Padro aberto, livre de royalties, para programao paralela em ambientes heterogneosAmbientes heterogneosCPUs multicore, GPUs many-coreFrameworkArquiteturaLinguagemAPI2IntroduoNeste tutorial...Conceitos da arquitetura OpenCLBreve viso da linguagem OpenCL CAPIs fundamentais para o desenvolvimentoExemplo completo de aplicaoIntegrao com OpenGLHello WorldCdigo sequencialvoid ArrayDiff(const int* a, const int* b, int* c, int n){ for (int i = 0; i < n; ++i) { c[i] = a[i] - b[i]; }}4Hello WorldCdigo 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];}5Aplicaes OpenCL

Camadas de uma aplicao OpenCL6Arquitetura OpenCLArquitetura abstrata de baixo nvelImplementaes mapeiam para entidades fsicasQuatro modelosPlataformaExecuoProgramaoMemriaArquitetura OpenCLModelo de plataformaDescreve entidades do ambiente OpenCLArquitetura OpenCLHospedeiroDispositivoDispositivo...Unidade de ComputaoUnidade de Computao...Elemento deProcessamentoElemento deProcessamento...Elemento deProcessamentoElemento deProcessamento...Modelo de PlataformaArquitetura OpenCLExemplo: GPU NVIDIAGPU: dispositivoStreaming Multiprocessor: unidade de computaoProcessor/Core: elemento de processamentoArquitetura OpenCLModelo de execuoDescreve instanciao e identificao de kernelsArquitetura OpenCLModelo de execuoEspaos de ndices1D2D3DArquitetura OpenCLModelo de execuo: itens e grupos de trabalhoGrupo de trabalho(work-group)Item de trabalho(work-item)Arquitetura OpenCL__kernel void f(...){ ...Item de trabalhoKernelInstnciaArquitetura OpenCLModelo de execuo: identificadores0101Grupo de trabalho:

(1, 0)Arquitetura OpenCLModelo de execuo: identificadores12001323Item de trabalho:

(1, 2)Identificador globalArquitetura OpenCLModelo de execuo: identificadoresItem de trabalho:

(1, 0)Identificador local1001Arquitetura OpenCLContextoDispositivosObjetos de programaObjetos de memriaFilas decomandosKernelsmemModelo de execuo: objetosArquitetura OpenCLModelo de execuo: objetosToda comunicao com um dispositivo feita atravs da sua fila de comandosObjetos de memriaBuffers: acesso direto via ponteirosImages: acesso especial via samplersArquitetura OpenCLModelo de programaoParalelismo de dados (data parallel): mltiplos itens de trabalho para um kernelParalelismo de tarefas (task parallel): um item de trabalho para um kernelArquitetura OpenCLModelo de memriaDescreve uma hierarquia de memria e o compartilhamento de cada nvel entre itens e grupos de trabalhoArquitetura OpenCLModelo de memriaMemria privada- Exclusiva de cada item de trabalho- Leitura e EscritaArquitetura OpenCLModelo de memriaMemria local- Compartilhada pelo grupo de trabalho- Leitura e EscritaArquitetura OpenCLModelo de memriaMemria global- Compartilhada por todos os itens de trabalho- Leitura e EscritaArquitetura OpenCLModelo de memriaMemria constante- Compartilhada por todos os itens de trabalho- Somente leituraArquitetura OpenCLModelo de memria: consistnciaUm item de trabalho l corretamente o que outros escrevem?Arquitetura OpenCLModelo de memria: consistncia- Memria consistente para um item de trabalhoItem de trabalhoMemriaxxArquitetura OpenCLModelo de memria: consistncia- Memria consistente para um grupo de trabalho aps uma barreira (barrier)Itens de trabalhoMemriaxy??Arquitetura OpenCLModelo de memria: consistncia- Memria consistente para um grupo de trabalho aps uma barreira (barrier)Itens de trabalhoMemriaxyArquitetura OpenCLModelo de memria: consistncia- Memria consistente para um grupo de trabalho aps uma barreira (barrier)Itens de trabalhoMemriabarrier()Arquitetura OpenCLModelo de memria: consistncia- Memria consistente para um grupo de trabalho aps uma barreira (barrier)Itens de trabalhoMemriayxArquitetura OpenCLSincronizaoBarreira: execuo s prossegue aps todos os itens de trabalho de um mesmo grupo de trabalho a terem atingidoNo h sincronizao entre grupos de trabalhoLinguagem OpenCL CUtilizada para a escrita de kernelsBaseada no padro C99Acrescenta extenses e restriesLinguagem OpenCL CExtenso: tipos vetoriaisNotao: tipo[# de componentes]1, 2, 4, 8 ou 16 componentesExemplos:

float4int8short2uchar16Linguagem OpenCL COperaes com tipos vetoriaisEntre vetores de mesmo nmero de componentesEntre 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 CDefinio de kernelsQualificador __kernelTodo kernel deve ser void

__kernel void f(){ ...}Linguagem OpenCL CQualificadores de espao de endereamentoDefinem nvel da memria apontada por um ponteiro__global, __local, __private e __constDefault: __privateLinguagem OpenCL CRestriesPonteiros para funo no so suportadosFunes e macros com nmero varivel de argumentos no so suportadosQualificadores extern, static e auto no so suportadosNo h suporte a recursoAPI de suporte: kernelsFunes de identificaoInformaes sobre espao 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: kernelsFunes de sincronizao

barrier(cl_mem_fence_flags flags)

Flags:

CLK_LOCAL_MEM_FENCECLK_GLOBAL_MEM_FENCEAPI de suporte: hospedeiroIlustrao atravs de um exemplo prticoAplicao completaKernel para subtrao dos elementos de dois arraysExemplo prticoExemplo de cdigo executado no hospedeiroIlustra as principais etapas para o desenvolvimento de solues OpenCLMulti-plataformaExemplo prtico#ifdef __APPLE__#include #else#include #endifExemplo prticocl_platform_id platformId;cl_device_id deviceId;

clGetPlatformIDs(1, &platformId, NULL);

clGetDeviceIDs( platformId, CL_DEVICE_TYPE_GPU, 1, &deviceId, NULL);Exemplo prticocl_context context = clCreateContext( NULL, 1, &deviceId, NULL, NULL, NULL);

cl_command_queue queue = clCreateCommandQueue( context, deviceId, NULL, NULL);Exemplo prticoconst 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 prticocl_program program = clCreateProgramWithSource( context, 1, &source, NULL, NULL);Exemplo prticoclBuildProgram( program, 0, NULL, NULL, NULL, NULL);

cl_kernel kernel = clCreateKernel( program,"ArrayDiff", NULL);Exemplo prtico#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_WRITEExemplo prticoint* hostA;

clEnqueueWriteBuffer( queue, bufA, CL_TRUE, 0, N * sizeof(int), hostA, 0, NULL, NULL);Exemplo prticoint* hostB;

clEnqueueWriteBuffer( queue, bufB, CL_TRUE, 0, N * sizeof(int), hostB, 0, NULL, NULL);Exemplo prticoclSetKernelArg( kernel, 0, sizeof(cl_mem), &bufA);clSetKernelArg( kernel, 1, sizeof(cl_mem), &bufB);clSetKernelArg( kernel, 2, sizeof(cl_mem), &bufC);Exemplo prticoconst size_t globalSize[] = { N };

clEnqueueNDRangeKernel( queue, kernel, 1, NULL, globalSize, NULL, 0, NULL, NULL);

clFinish(queue);Exemplo prticoint* hostC;

clEnqueueReadBuffer( queue, bufC, CL_TRUE, 0, N * sizeof(int), hostC, 0, NULL, NULL);Exemplo prticoclReleaseMemObject(bufC);clReleaseMemObject(bufB);clReleaseMemObject(bufA);clReleaseKernel(kernel);clReleaseProgram(program);clReleaseCommandQueue(queue);clReleaseContext(context);Interoperao com OpenGLEm GPUs, possvel compartilhar estruturas entre OpenCL e OpenGLExemplo prtico: malha tridimensionalVrtices posicionados via OpenCLExibio via OpenGLCompartilhamento de Vertex Buffer Object (VBO)OpenCL: array de float4Interoperao com OpenGLDemonstraoInteroperao 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); KernelInteroperao 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);Criao do contextoInteroperao 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);Criao do VBOInteroperao com OpenGLcl_mem vbo_cl;

vbo_cl = clCreateFromGLBuffer( context, CL_MEM_WRITE_ONLY, vbo, NULL);Criao do objeto de memria a partir do VBOInteroperao com OpenGLclEnqueueAcquireGLObjects( queue, 1, &vbo_cl, NULL, NULL, NULL);Aquisio do VBOInteroperao com OpenGLsize_t globalSize[] = { MESH_WIDTH, MESH_HEIGHT };

clEnqueueNDRangeKernel( queue, kernel, 2, NULL, globalSize, NULL, 0, 0, 0);

clFinish(queue);Execuo do kernelInteroperao com OpenGLclEnqueueReleaseGLObjects( queue, 1, &vbo_cl

Recommended

View more >