programação em opencl: uma introdução prá...

Download Programação em OpenCL: Uma introdução prá bosco.sobral/ensino/ine5645/Programacao_OpenCL... ·…

Post on 26-Nov-2018

212 views

Category:

Documents

0 download

Embed Size (px)

TRANSCRIPT

  • Programao em OpenCL: Uma introduo prtica

    Csar L. B. Silveira1, Luiz G. da Silveira Jr.2, Gerson Geraldo H. Cavalheiro3

    1V3D LabsSo Leopoldo, RS, Brasil

    2Universidade do Vale do Rio dos SinosSo Leopoldo, RS, Brasil

    3Universidade Federal de PelotasPelotas, RS, Brasil

    {cesar,gonzaga}@v3d.com.br, gerson.cavalheiro@ufpel.edu.br

    Abstract. OpenCL is an open standard for high-performance computing in he-terogeneous computational environments composed of multicore CPUs and many-core GPUs. OpenCL makes it possible to write multi-platform code for suchdevices, without the need to use vendor-specific languages and tools. Focusedon parallelism, programming in OpenCL is based on writing functions that areexecuted in multiple simultaneous instances. This minicourse aims to introducekey concepts and explore the architecture defined by the OpenCL standard.

    Resumo. OpenCL um padro aberto para programao de alto desempenhoem ambientes computacionais heterogneos equipados com CPUs multicore eGPUs many-core. OpenCL torna possvel a escrita de cdigo multi-plataformapara tais dispositivos, sem a necessidade do uso de linguagens e ferramentas es-pecficas de fabricante. Com foco no paralelismo, a programao em OpenCLbaseia-se na escrita de funes que so executadas em mltiplas instncias si-multneas. Este minicurso visa introduzir conceitos-chave e explorar a arquite-tura definida no padro OpenCL.

    1. IntroduoO processamento paralelo hoje uma realidade em praticamente todos os segmentos quefazem uso de sistemas computacionais. Este fato deve-se aos avanos tecnolgicos quepermitiram baratear o custo das opes de hardware paralelo, como os processadores mul-ticore e as placas grficas disponibilizando at centenas de processadores (stream proces-sors). Como consequncia, mesmo usurios domsticos possuem configuraes dotadasde mltiplas unidades de processamento destinadas aos mais prosaicos usos, como nave-gao na Internet, processamento de texto e jogos. O problema que se coloca capacitarrecursos humanos a utilizar de forma efetiva todo este potencial de processamento dispo-nvel para computao de alto desempenho.

    O emprego de processadores multicore para o processamento paralelo no , naverdade, uma novidade no mercado do desenvolvimento de software. Ressalvas feitas,

  • contudo, possibilidade de tirar benefcios deste hardware especfico explorando suascaractersticas prprias [Cavalheiro and dos Santos 2007]. Por outro lado uso tradicionaldas placas grficas, como seu nome j indica, esteve durante muito tempo associado saplicaes de computao grfica e/ou processamento de imagens. Nos ltimos anos, estetipo de arquitetura tem sido considerada para implementaes de aplicaes cientficas emum escopo mais genrico, uma vez que seus processadores, chamados de GPU (GraphicsProcessing Unit Unidade de Processamento Grfico), dispem de grande capacidadede processamento. O uso de placas grficas, ou simplesmente, de GPUs, justifica-se emfuno do desempenho obtido pelo investimento realizado [Genovese et al. 2009], o qual altamente favorvel ao usurio final. Como resultado, diversas aplicaes com altograu de demanda computacional, como dinmica molecular [Amos G. Anderson 2007]e mtodos de elementos finitos [Gddeke et al. 2007], entre outras, tm recebido solu-es implementadas sobre GPUs. Os jogos de computadores tm se beneficiado tantodo poder de processamento grfico das GPUs quanto do potencial para computao ge-nrica destes dispositivos, para a realizao de simulaes de fenmenos fsicos, detec-o de colises, simulao de fluidos, entre outros. O uso da GPU para processamentode propsito geral possibilidade ganhos significativos de desempenho, permitindo o de-senvolvimento de jogos e aplicaes mais realistas. Alm disso, o poder de processa-mento paralelo das GPUs pode tambm ser empregado no processamento de udio ena execuo de algoritmos inteligncia artificial. Atualmente o mercado est sendo su-prido por ferramentas para programao neste tipo de arquitetura, como a plataformaCUDA [NVIDIA Corporation 2010], disponvel para vrias linguagens de programao,e OpenCL [Apple Inc. 2009, Khronos Group 2010a].

    A presena macia de configuraes de computadores dotados de processado-res multicore e placas grficas dotadas de mltiplas unidades de processamento indicaa necessidade de uma convergncia dos esforos de desenvolvimento de software. Taisconfiguraes so ditas heterogneas, dada a natureza dos recursos de processamento.Tradicionalmente, cada tipo de recurso tem seu poder explorado por meio de tcnicas etecnologias especficas de cada um. A capacidade de processamento paralelo oferecidapor processadores multicore pode ser explorada pelo uso de multithreading, habilitadopor tecnologias como POSIX Threads, Cilk, Anahy, OpenMP, entre outros. Por sua vez,o poder de processamento oferecido pelas GPUs vem sendo explorado atravs de tool-kits especficos de fabricante, como NVIDIA CUDA e ATI Streaming SDK. No contextodo processamento grfico e renderizao 3D em tempo-real, emprega-se uma API gr-fica como OpenGL [Shreiner and Group 2009] ou Direct3D, parte do DirectX SDK daMicrosoft1.

    Assim, o desenvolvimento de solues em plataformas computacionais heterog-neas apresenta-se com custo elevado para o desenvolvedor, que deve possuir domnio dediversos paradigmas e ferramentas para extrair o poder computacional oferecido por estasplataformas. Neste contexto, surge OpenCL (Open Computing Language), criada pelaApple [Apple Inc. 2009] e padronizada pelo Khronos Group [Khronos Group 2010a].OpenCL a primeira plataforma aberta e livre de royalties para computao de alto de-sempenho em sistemas heterogneos compostos por CPUs, GPUs, e outros processadoresparalelos. OpenCL oferece aos desenvolvedores um ambiente uniforme de programao

    1http://www.microsoft.com/games/en-US/aboutGFW/pages/directx.aspx

  • paralela para escrever cdigos portveis para estes sistemas heterogneos, a fim de tiraremproveito do poder de processamento dos dispositivos grficos e processadores e us-lospara diversas aplicaes em mltiplas plataformas computacionais. O objetivo do padroOpenCL unificar em um nico paradigma e conjunto de ferramentas o desenvolvimentode solues de computao paralela para dispositivos de naturezas distintas. Para viabi-lizar o emprego de OpenCL no desenvolvimento de jogos necessrio que se promovaa interoperao entre OpenCL e OpenGL. Assim, alm dos conceitos de OpenCL, sermostrado de forma prtica como informaes processadas de forma paralela por duas di-ferentes APIs so compartilhadas, ou seja, como resultados de clculos realizados pelaOpenCL podem afetar o processamento grfico realizado pela OpenGL.

    Atualmente na sua verso 1.1 [Khronos Group 2010b], a especificao OpenCL realizada em trs partes: uma linguagem, uma camada de plataforma e um runtime. Aespecificao da linguagem descreve a sintaxe e a API para escrita de cdigo em OpenCL,que executa nos aceleradores suportados: CPUs multicore, GPUs many-core e processa-dores OpenCL dedicados. A linguagem baseada na especificao C99 da linguagemC [ISO 2005]. A camada de plataforma fornece ao desenvolvedor acesso s rotinas quebuscam o nmero e os tipos de dispositivos no sistema. Assim, o desenvolvedor podeescolher e inicializar os dispositivos adequados para o processamento. O runtime permiteao desenvolvedor enfileirar comandos para execuo nos dispositivos, sendo tambm responsvel por gerenciar os recursos de memria e computao disponveis.

    Na prtica, aplicaes OpenCL so estruturadas em uma srie de camadas, comomostra a Figura 1. Kernels correspondem s entidades que so escritas pelo desenvolve-dor na linguagem OpenCL C. A aplicao faz uso da API C do padro para comunicar-secom a camada de plataforma (Platform Layer), enviando comandos ao runtime, que ge-rencia diversos aspectos da execuo.

    Hardware (GPU,CPU,...)

    Driver

    OpenCL runtime

    OpenCL Platform Layer

    API OpenCL C

    Aplicao

    Kernels

    Figura 1. Arquitetura em camadas de uma aplicao OpenCL.

  • 1.1. Hello World OpenCLA fim de evitar que o leitor tenha que ser introduzido a muitos conceitos tericos antes deter uma ideia prtica de como ocorre a programao em OpenCL, ser apresentado aquium exemplo simples de cdigo. O trecho de cdigo a seguir corresponde a um kernel quecalcula a diferena entre os elementos de dois arrays e os armazena em um terceiro:

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

    }

    Por ora, os detalhes a respeito de palavras-chave da linguagem, como __kernele __global sero deixados de lado, pois sero introduzidos mais adiante. O que importante observar no cdigo que no h um lao para iterar sobre os arrays. EmOpenCL, o cdigo escrito geralmente foca-se na computao de uma unidade do resultadodesejado. O runtime fica responsvel por criar tantas instncias do kernel quantas foremnecessrias para o processamento de todo o conjunto de dados, no momento da execuo.Cada instncia recebe um conjunto de identificadores que permitem determinar a porodos dados pela qual responsvel, habilitando o processamento paralelo dos dados.

    A ttulo de comparao, o cdigo na sequncia realiza a mesma tarefa, porm deforma 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];}

    }

    interessante observar que no foi necessrio informar ao kernel OpenCL o ta-manho do conjunto de dados, uma vez que a manipulao desta informao responsabi-lidade do runtime.

    O uso de OpenCL , portanto, recomendado para aplicaes que realizam opera-es computacionalmente custosas, porm paralelizveis por permitirem o clculo inde-pendente de diferentes pores do resultado.

    1.2. Organizao do textoO restante do texto est organizado como segue. A Seo 2 introduz os conceitos daarquitetura OpenCL. As Sees 3 e 4