Você está na página 1de 16

Sintaxe e semntica operacional de linguagens voltadas para GPU

Igor L. O. Bastos1, Luciana P. V Silva1


1

Mestrando(a) em Cincias da Computao(MCC) Universidade Federal da Bahia (UFBA) Caixa Postal: 40.170-110 Salvador BA Brasil
{igorcrexito,lucianapvs}@gmail.com

Abstract. The growing advance of GPUs in recent years has boosted the emergence of languages according to these boards, which have resources for building applications that require high performance. Languages like C for Graphics (CG), Compute Unified Device Architecture (CUDA) and Open Computing Language (OpenCL) are some of the most commonly used in these applications. Although based on the C language, these languages have particularities, in terms of syntax and semantics. Thus, this paper presents some particularities of the languages CG, CUDA and OpenCL regarding the operational semantics and syntax when compared to the C language. Resumo. O crescente avano das GPUs nos ltimos anos impulsionou o surgimento de linguagens voltadas para estas placas, as quais apresentam recursos para criao de aplicativos que exigem alto desempenho. Linguagens como C for Graphics (CG), Compute Unified Device Architecture (CUDA) e Open Computing Language (OpenCL) so algumas das mais utilizadas nestas aplicaes. Apesar de baseadas na linguagem C, estas linguagens apresentam especificidades, no tocante sintaxe e semntica. Desta forma, este trabalho visa apresentar algumas das especificidades das linguagens CG, CUDA e OpenCL em relao semntica operacional e sintaxe quando comparadas linguagem C.

1. Introduo
Desde a dcada de 80, os chips grficos, intitulados de Graphical Processing Units (GPUs), tm estado em constante evoluo, partindo de uma arquitetura de um nico ncleo e especfica para processamento de objetos grficos, para chips multinucleados com alto poder de paralelismo e processamento; capazes de serem programados e de atuar sobre dados gerais [McClanahan 2011]. A programabilidade das GPUs, iniciada em 2001, se deu com a insero da capacidade de programar etapas do pipeline grfico, o qual corresponde aos estgios que as informaes grficas passam dentro das GPUs e s transformaes que passam para serem transformadas de dados em um espao tridimensional para dados bidimensionais e capazes de serem representados nos dispositivos de sada (como monitores) [The Graphics Pipeline 2013]. Esta insero de programabilidade permitiu o surgimento de linguagens como o C for Graphics (CG) em 2002 [McClanahan 2011]. O contnuo avano das GPUs permitiu, mais uma vez, uma mudana quanto sua programabilidade. Esta mudana, baseada em uma alterao da arquitetura das placas, ocorreu em 2006, quando as GPUs passaram a conter uma grande quantidade de

processadores de propsito geral, capazes de processar dados genricos, fato este que deu origem chamada arquitetura unificada. Com isso, todo o pipeline grfico passou a ser programvel e houve o surgimento de linguagens prprias para a execuo de dados genricos na GPU, como as linguagens CUDA e OpenCL [McClanahan 2011]. Na Figura 1, abaixo, a evoluo das GPUs pode ser vista a partir de 1993. Esta evoluo dividida em geraes, sendo que cada uma delas foi marcada por mudanas na arquitetura das placas.

Figure 1. Evoluo das GPUs.

Desde 2009, as empresas fabricantes de GPUs passaram a investir em arquiteturas de GPUs tpicas para o processamento de dados. As linguagens voltadas para GPUs passaram a ganhar maior maturidade e gama de recursos, alm das prprias GPUs terem grande acrscimo de poder de processamento. interessante notar que as linguagens para GPU, apesar de usualmente baseadas na linguagem C, apresentam especificidades que as permitem acessar e utilizar, da melhor forma possvel, os recursos das GPUs. Estas especificidades provem mudanas sintticas e semnticas destas linguagens quando comparadas ao C. Desta forma, este trabalho visa apresentar algumas das particularidades das linguagens CG, CUDA e OpenCL, focando em sua sintaxe e semntica operacional e comparando-as linguagem C. Assim, este artigo organiza-se de forma a apresentar, primeiramente, alguns conceitos relativos s linguagens abordadas e relativos sintaxe e semntica operacional de linguagens de programao, seguidos pelos resultados provenientes da anlise das linguagens abordadas e suas comparaes com a linguagem C. Por fim, apresentada uma discusso quanto anlise realizada.

2. Conceitos envolvidos no trabalho


Nesta seo, os principais conceitos a respeito das linguagens de programao a serem analisadas, alm de conceitos relativos semntica e sintaxe sero brevemente abordados. 2.1. Linguagem C for Graphics (CG) O C for Graphics uma linguagem criada pela Nvidia em 2002 com o intuito de simplificar a programao dos shaders de vrtice e fragmento, os quais so etapas do pipeline grfico [C for Graphics 2013]. Esta linguagem baseada no C, incluindo algumas caractersticas de linguagens mais modernas, como Java ou C++, alm de caractersticas de linguagens voltadas para GPU, como Renderman e Stanford [CG Laguage Specification 2013]. Apesar da base em C, o CG inclui algumas novas idias, as quais se atm, principalmente, ao fato de ser voltada para GPUs e estas trabalharem de forma diferente das CPUs [C for Graphics 2013]. Alm disso, pode-se salientar que o CG inclui recursos para trabalhar com objetos grficos e matrizes, tais como a adio de um tipo especfico para operao com texturas e operadores para manipulao e criao de vetores e matrizes [CG Laguage Specification 2013].

Figure 2. Linguagem CG. [CG Toolkit 2013].

2.2. Linguagem Compute Unified Device Architecture (CUDA) Apesar de informalmente chamada de linguagem de programao, o CUDA corresponde a uma plataforma de computao paralela e um modelo de programao inventados pela Nvidia em 2006. Por ser moldada para a execuo de aplicaes em placas grficas, o CUDA permite aumentos significativos na performance de aplicaes, extraindo ao mximo o poder de processamento destas GPUs [NVidia CUDA 2013]. Assim como o CG, o CUDA tem sua sintaxe e semntica baseadas na linguagem C. Por ser voltada para a arquitetura unificada, o CUDA capaz de tratar e manipular dados genricos, sendo desta forma considerada uma linguagem de propsito geral. importante salientar, quando ao CUDA, que a execuo das suas aplicaes na GPU feita sob uma hierarquia de threads e blocos, os quais permitem a definio do quanto e do como se deseja paralelizar a execuo da aplicao. Esta execuo feita

inicialmente no host (CPU), o qual invoca kernels para serem executados na GPU [CUDA Programming Guide 2013].

Figure 3. Plataforma CUDA. [GPGPU CUDA 2013].

2.3. Open Computing Language (OpenCL) Assim como o CUDA, o OpenCL representa uma plataforma para computao paralela em GPUs. Apesar desta similaridade, o OpenCL, diferentemente do CUDA, abrange a computao em ambientes heterogneos, os quais incluem CPUs, GPUs e outros processadores [Munshi 2008]. A plataforma OpenCL foi fundada pelo Khronos Group em 2008, sendo que este grupo formado por diversas empresas do ramo de tecnologia, incluindo a prpria Nvidia e a sua principal concorrente, a ATI [Munshi 2008]. A execuo das aplicaes no OpenCL feita de forma similar ao CUDA, diferindo apenas na nomenclatura de seus recursos. Threads nesta plataforma so chamadas de work-items e blocos so chamados de work-groups. De forma anloga, os programas so inicialmente executados no host (CPU) e podem executar kernels para execuo das suas tarefas de forma paralela.

Figure 4. Plataforma OpenCL. [ArrayFire 2013].

2.4. Sintaxe A sintaxe de uma Linguagem de Programao (LP) pode ser definida como um conjunto de regras que determina quais construes da linguagem em questo so vlidas ou no. [Sintaxe e Semntica 2013] A sintaxe formada por regras lxicas e regras sintticas. A primeira descreve as combinaes vlidas de caracteres que formam os tokens (i.e. palavras reservadas,

identificadores, operadores) da LP. A segunda descreve como estes tokens sero combinados com o objetivo de formar instrues vlidas (i. e. comandos, expresses, sub-rotinas). [Sintaxe e Semntica 2013] Normalmente, a sintaxe de uma LP definida atravs de um conjunto de regras representado por uma Gramtica Livre de Contexto (GLC). Segundo [Menezes 2000], uma GLC uma gramtica onde o lado esquerdo das produes contm exatamente uma varivel. Uma GLC G uma qudrupla onde: = (, , , ) Sendo V o alfabeto que contm os smbolos no terminais ou variveis (smbolos auxiliares no processo de gerao de cadeias). T um subconjunto de V conhecido como alfabeto dos smbolos terminais (smbolos utilizados nas cadeias da linguagem). P o conjunto de regras da gramtica que servir para gerar as palavras da linguagem. E, por ltimo, S que o smbolo no terminal de incio utilizado para iniciar as derivaes de cadeias de linguagem. [Gramtica Livre de Contexto 2013]
Tabela 1. Estruturas de notao da BNF [Garshol 2008]

Smbolo/Estrutura ::= <...> {...} (...) |

Significado Definido como Identificador Repeties Elementos agrupados Ou

Dentre as GLCs, a mais utilizada a BNF (Backus Naur Form). Esta notao foi desenvolvida por John Backus e, mais tarde, revisada e expandida por Peter Naur. Inicialmente a BNF foi desenvolvida para descrever a sintaxe da linguagem ALGOL1. [Garshol 2008]. A tabela 1 mostra os smbolos e estruturas utilizados na notao BNF. Exemplos de regras lxicas e sintticas na notao BNF podem ser vistas respectivamente nas tabelas 2 e 3.
Tabela 2. Exemplos de regras lxicas [Sintaxe e Semntica 2013]

Regra <digit>::= 0 | 1 | 2 | ... | 9 <letter>::= a | b | c | ... | z

Significado Definio de dgito na linguagem Definio de letra na linguagem

Linguagem de programao desenvolvida em 1950 para evitar alguns dos problemas existentes no FORTRAN e que veio a dar impulso a outras linguagens de programao como o Pascal. [ALGOL 2013]

Tabela 3. Exemplos de regras sintticas [Sintaxe e Semntica 2013]

Regra <program>::= program<identifier>; <block> <block>::=<declaration seq>begin<command seq> end 2.5. Semntica

Significado Definio de programa na linguagem Definio de bloco na linguagem

Semntica o estudo do significado. [Semntica 2013] Em programao, semntica complementar a sintaxe e diz respeito descrio do significado das instrues sintaticamente vlidas de uma linguagem. [Sintaxe e Semntica 2013] A semntica de uma LP dividida em dois tipos: esttica, que descreve as caractersticas do programa vlido, e dinmica, que descreve os resultados da execuo do programa. Dentre as abordagens para se descrever a especificao de uma semntica est a Semntica Operacional que descreve o significado de um programa atravs da execuo de suas instrues em uma mquina real ou simulada. Essa abordagem possui dois tipos: natural e estruturada. A verso natural descreve como os resultados gerais so obtidos enquanto a estruturada descreve como os passos individuais da computao ocorrem na execuo do programa. [Semntica Formal 2013] A figura 5 mostra um exemplo de uma instruo e sua semntica operacional.

Figura 5: Semntica Operacional da instruo For

3. Sintaxe e semnticas das linguagens


O suporte execuo de dados de forma paralela, alm dos recursos relacionados manipulao de imagens, matrizes e estruturas para conter grandes volumes de dados, propiciaram s linguagens CG, CUDA e OpenCL a adio de instrues que diferem do C, linguagem na qual estas so baseadas. Alm desta adio, algumas instrues, tambm presentes no C, passaram a apresentar, nestas linguagens, uma semntica diferente. 3.1. C for Graphics (CG) A primeira linguagem a ser analisada neste trabalho o C for Graphics (CG). Nas sees seguintes, a sintaxe e semntica operacional desta linguagem sero apresentadas. 3.1.1 Sintaxe de instrues do CG A linguagem CG possui um forte suporte manipulao de matrizes e vetores nopresente, nativamente, na linguagem C convencional. Devido a isso, esta linguagem

permite a inicializao de estruturas denominadas packed arrays[CG Language Specification 2013], as quais representam vetores dos tipos de dados presentes no C, alm do tipo sampler, presente no CG [CG Language Specification 2013]. A inicializao destas estruturas pode ser visto na Tabela 4, a seguir.
Tabela 4. Inicializao de packed arrays no CG.

Os dados presentes na Tabela 4 permitem a realizao de uma comparao entre o CG e o C, no tocante gramtica, quanto inicializao de estruturas. Este comparativo pode ser visualizado na Tabela 5, a seguir, a qual considera a declarao como um no-terminal. Vale lembrar que os no-terminais ident e type_spec so provenientes da gramtica da linguagem C [Gramtica da Linguagem C 2013], representando, respectivamente, os identificadores desta linguagem e os possveis tipos de variveis, como float, int, char, entre outros.
Tabela 5. Comparao da gramtica quanto inicializao de variveis das linguagens C e CG.

Ainda em relao Tabela 5, nota-se que no CG, a repetio do no-terminal num pode ser feita de 0 a 2 vezes, evidenciando que a inicializao pode ser feita sem qualquer nmero (para inicializao de uma varivel qualquer), com um nmero (para inicializao de um vetor), ou com dois (para a inicializao de uma matriz bidimensional). Um outro recurso adicional no CG, tambm no-presente no C, a funo Swizzle. Esta funo permite o acesso s componentes dos vetores atravs de ndices fixos, os quais correspondem aos canais de cores de uma imagem (r,g,b e a) ou aos eixos de um suposto espao quadridimensional (x,y,z e w). A utilizao desses ndices permite, ainda, a recombinao dos elementos dos vetores, alterando a ordem das componentes ou mesmo repetindo-as. A sintaxe desta instruo pode ser vista na Tabela 6, a seguir.

Tabela 6. Gramtica de funo Swizzle.

Ainda em relao Tabela 6, percebe-se que no possvel utilizar os ndices de forma alternada (por exemplo, r,g,x e y). Ao se iniciar o uso da funo swizzle com um desses tipos de ndice, deve-se utilizar somente este mesmo tipo. Vale ressaltar ainda que, em termos de sintaxe, pode-se repetir um determinado ndice inmeras vezes, mesmo que isso faa exceder o tamanho do vetor. O acesso aos dados de vetores e matrizes no CG pode tambm ser feito de uma forma diferente. Apesar de a linguagem suportar o acesso da maneira convencional, esta inclui, adicionalmente, um acesso de uma maneira diferente, qual associado um melhor desempenho. A Tabela 7, a seguir, demonstra esta forma adicional de se acessar ndices de vetores e matrizes no CG.
Tabela 7. Acesso aos ndices de uma matriz no CG.

Nota-se, ainda na Tabela 7, que para o acesso aos ndices utilizando esta forma diferente do CG, precisa-se incluir os terminais ._m, seguido pelos ndices do elemento da matriz que se deseja acessar. Por exemplo, se desejado acessar o elemento da coluna 2 e da linha 3 da matriz de inteiros Matrix, deve-se chamar a funo da seguinte forma: = . _ 3.1.2. Semntica operacional de instrues no CG A anlise da semntica operacional de uma instruo permite, se feita de maneira formal e seguindo os pressupostos da semntica operacional estruturada, a obteno de todos os estados gerados durante a execuo de uma rotina. Esta semntica, quando utilizada para anlise de grandes trechos de cdigos, torna-se extremamente complicada se no feita de maneira informal. Na Tabela 8, a seguir, pode ser vista a semntica operacional de um lao for na linguagem C.

Tabela 8. Semntica operacional do lao for.

Em relao ainda Tabela 8, nota-se, na verso formal, a gerao de um estado inicial s0, ao qual se associa valores iniciais das variveis i e x. A cada passo presente na instruo (atribuies, por exemplo), estados novos so gerados derivados dos seus anteriores (como s1, por exemplo, que derivado do s0 com a alterao do valor de x para 2). Nota-se que, ao fim da execuo do comando for, gerado o estado sf, o qual corresponde execuo inteira do lao. Por outro lado, nota-se que a verso informal feita de forma mais simplista, onde a representao da semntica feita de forma mais intuitiva. J na linguagem CG, o lao for tem a semntica operacional distinta da linguagem C convencional. Os laos no CG precisam possuir a capacidade de serem desenrolados, isto , deve ser possvel calcular separadamente cada uma de suas iteraes. Isso se deve ao fato de que as GPUs possuem a capacidade de processar dados paralelamente, fazendo com que as iteraes do for sejam executadas concomitantemente. A Tabela 9, a seguir, demonstra a semntica operacional do lao for no CG na viso de cada unidade de processamento da GPU. Note que, para cada unidade de processamento, chamada nas GPUs modernas de stream processsor (SP), gera-se estados que condizem com apenas uma nica iterao do lao, assemelhando a instruo a um lao de apenas 1 (uma) iterao. Vale ressaltar que, mediante a quantidade de iteraes ser superior ao nmero de SPs, tem-se uma distribuio onde os SPs (ou pelo menos alguns deles) atuam sobre mais de uma iterao do lao.
Tabela 9. Semntica operacional no CG do lao for.

Uma outra instruo que tem sua semntica operacional distinta do C convencional o condicional. Devido s limitaes das GPUs no tocante realizao de saltos (branches), estas instrues condicionais so executadas inteiramente na GPU, independente da satisfao da condio envolvida, j que o custo da realizao desse salto superior ao da execuo dos dois membros da instruo (lembre-se que a GPU os executa paralelamente). Na Tabela 10, a seguir, pode ser vista a semntica operacional da instruo if no C e no CG. Nota-se que no C convencional, so gerados estados apenas relacionados condio satisfeita na instruo. J no CG, so gerados estados para ambos os lados da instruo (executa-se ambas as condies), fazendo com que ao final da execuo, deixe-se de realizar um possvel salto contendo um bloco de comandos, para um salto curto com apenas uma atribuio simples, a qual gera o valor correto no estado final.
Tabela 10. Semntica operacional nas linguagens C e CG.

3.2. Compute Unified Device Architecture (CUDA) O CUDA, assim como o CG e o OpenCL, possui sua sintaxe e semntica baseadas na linguagem C. Instrues como os laos ou condicionais apresentam semntica similar do CG, mostrado anteriormente. Uma diferena entre CUDA e o CG o fato de que, no primeiro, o programador explicita o paralelismo, definindo o nmero de threads e blocos para executar a instruo, enquanto no CG, esse paralelismo feito de forma implcita ao desenvolvedor. Uma outra diferena o uso de modificadores nas variveis e mtodos do kernel que se deseja executar, os quais determinam a memria e o dispositivo onde as instrues sero executadas. 3.2.1. Sintaxe de instrues no CUDA A declarao de funes no CUDA difere da linguagem C, no tocante sintaxe, devido ao acrscimo de quantificadores no cabealho destas funes, sendo estes responsveis por determinar onde essas funes podem ser chamadas e onde sero executadas. Os modificadores podem assumir os valores mostrados na Tabela 11, a seguir.

Tabela 11. Modificadores do CUDA.

Modificadores _global_ _device_ _host_

Impactos do seu uso


Funes exclusivamente chamadas no host e que podem executar tanto nele quanto na GPU. Funes chamadas no host ou na GPU, mas que executam somente em GPU. Funes chamadas exclusivamente no host e que executam somente neste host.

Com o acrscimo dos quantificadores, a declarao de funes no CUDA passa a assumir a sintaxe mostrada a seguir, na Tabela 12.
Tabela 12. Sintaxe da declarao de funes no CUDA.

Ainda quanto a Tabela 12, nota-se que diferentemente do C convencional, no CUDA o usurio forado a usar os quantificadores mostrados anteriormente. Os noterminais class_spec, type_spec, id e params esto presentes na gramtica do C/C++ e correspondem, respectivamente, aos modificadores de mtodo auto ou static, presentes no C++; aos tipos de retorno, os quais so previstos no C, aos identificadores, seguindo a sintaxe do C e, por fim, aos possveis parmetros, os quais seguem a sintaxe tambm do C. Um raciocnio similar usado, no CUDA, para a declarao de variveis. Assim como na declarao de funes, modificadores so utilizados, porm, estes so opcionais e definem a memria onde a varivel ser armazenada e a memria que estas tero acesso. A lista de quantificadores pode ser vista a seguir, na Tabela 13.
Tabela 13. Modificadores de variveis no CUDA.

Modificadores _device_ _shared_

Impactos do seu uso


Variveis alocadas na GPU, acessada por qualquer thread presente na GPU e com ciclo de vida igual ao da aplicao Variveis alocadas na GPU, no espao de memria referente a um bloco. Podem ser acessadas por threads dentro do bloco e tem ciclo de vida igual ao do bloco. Variveis alocadas na GPU ou CPU em um espao de memria constante. Acessvel por qualquer thread da grid ou mesmo pelo host. Tem ciclo de vida igual ao da aplicao.

_constant_

importante ressaltar que o modificador _device_ pode ser utilizado em combinao com os demais. Assim, a sintaxe da instruo pode ser vista, em termos de gramtica, como na Tabela 14, a seguir.
Tabela 14. Sintaxe da declarao de variveis no CUDA.

Note que, na representao da gramtica, o no-terminal modifier pode ser qualquer um dos termos mostrados anteriormente, assim como podem corresponder combinao do termo _device_ com o demais modificadores. 3.2.2. Semntica Operacional no CUDA O CUDA, por ser tambm uma linguagem voltada para GPU assim como o CG, apresenta sintaxe similar do mesmo. Porm, o paralelismo no CUDA feito em termos de threads e blocos, definidos pelo programador, para a execuo da instruo. Assim, pode-se avaliar, por exemplo, o lao for nesta instruo, em termos de semntica operacional, como mostrado na Tabela 15, a seguir.
Tabela 15. Semntica operacional do lao for no CUDA.

Nota-se, ainda na Tabela 15, que sem a execuo das instrues blockIdx e threadIdx, o lao no CUDA executado serialmente, de forma similar linguagem C. Por sua vez, com a insero destas instrues, a execuo feita em paralelo se assemelhando do CG. No entanto, no CG, cada iterao executada por uma unidade de processamento da GPU, enquanto no CUDA, cada iterao executada por uma thread, que pode ser alocada em conjunto com diversas outras para uma mesma

unidade. Note, na Tabela 15, que a semntica operacional do lao paralelo no CUDA feita sob a tica de cada thread e, portanto, um nico estado gerado alm do estado inicial s0. 3.3 Open Computing Language (OpenCL) O padro OpenCL define uma linguagem chamada OpenCL C. Tal linguagem usa a sintaxe do C99, padro ISO C publicado em 1999, com algumas extenses (i.e. tipos de dados) e restries (i.e. ponteiros de funo, recurso, alocao dinmica de memria) especficas. [Munshi 2008] 3.3.1 Sintaxe de Instrues Em comparao com a linguagem C, o OpenCL C especifica novos tipos de dados e qualificadores de funo e de espao de endereamento de cdigo. O qualificador de funo _kernel indica as funes (trechos de cdigo) que sero executados nos processadores. Na execuo de um kernel, so criadas threads que executam o mesmo cdigo com dados diferentes. Os qualificadores de espao e endereamento _global, _local, _constant e _private especificam o tipo ou regio da memria em que a varivel est alocada. [Silveira, Silveira e Cavalheiro 2010] Os tipos de dados oferecidos na linguagem so divididos em duas categorias: tipos escalares e tipos vetoriais (especfico do OpenCL C em relao linguagens C e C++). O primeiro armazena informaes numricas com diferentes nveis de preciso e intervalos. O segundo armazena mltiplos dados escalares em uma nica estrutura podendo variar de 1 at 16 componentes [Semntica 2013, Semntica Formal 2013]. O OpenCL C habilita que operadores tpicos da linguagem C, como +, -, *, /, sejam utilizados para realizar operaes entre vetores. Tais operaes so realizadas em cada componente do vetor independentemente, como mostram as figura 6a e 6b. [Munshi 2008]

Figura 6: Operaes com vetores. Instrues (a) e (b) so equivalentes.

Converses implcitas e converses explcitas por casting entre tipos escalares so permitidas e realizadas de acordo com a especificao da C99. A linguagem no habilita estas converses para tipos vetoriais, entretanto prov um conjunto de funes de que podem ser usadas tanto para tipos escalares quanto para tipos vetoriais (figuras 7a e 7b). [Munshi 2008]

Figura 7: (a) Formato de funo de converso. (b) Exemplo de converso [Munshi 2008].

3.3.2 Semntica Operacional de Instrues O OpenCL emprega uma modelo de paralelismo muito correspondente ao modelo do CUDA. Assim como no CUDA, para realizar a execuo paralela em OpenCL necessrio fazer com que o programa do host dispare funes do kernel. A semntica do loop parecida com a do CUDA, a grande diferena est em como o OpenCL acessa um valor de ndice em um kernel. Em CUDA, o ndice de um thread global na dimenso x definido como blockIdx.x * blockDim.x + threadIdx.x. Enquanto em OpenCL o ndice global chamado atravs de uma funo da API, get_global_id(), com um parmetro que identifica a dimenso. Para a dimenso x, get_global_id(0) e para as dimenses y e z, 1 e 2, respectivamente.

Figura 8: Loop serial e Loop Paralelo no OpenCL

Cada iterao no OpenCL executado por um kernel que, assim como as threads em CUDA, pode ser alocado em conjunto com diversas outras instncias do mesmo kernel sendo para cada um os valores dos dados sero diferentes.

4. Consideraes Finais
Com o desenvolvimento do presente trabalho, pde-se levantar dados e realizar comparaes entre trs das mais comumente utilizadas linguagens voltadas para GPUs. Pde-se associar a semntica e sintaxe destas linguagens com caractersticas destas placas grficas, sendo estas distintas, por exemplo, da linguagem C, a qual estas linguagens tomam como base e voltada para CPUs. Notou-se que as linguagens voltadas para GPUs apresentam caractersticas desejveis quanto alocao e manipulao de grandes volumes de dados e que sua semntica apresenta distines relacionadas, principalmente, capacidade de execuo das instrues de forma paralela.

Referncias
ALGOL (2013). Disponvel em: <http://en.wikipedia.org/wiki/ALGOL>. Acesso em: 10 mar. 2013. ArrayFire (2013). Disponvel em: <http://www.accelereyes.com/products/arrayfire>. Acesso em 05 mar. 2013. C for Graphics (2013). Disponvel em: <http://www.opengl.org/wiki/Cg>. Acesso em 17 fev. 2013. CG Language Specification (2013). Disponvel em: <http://http.developer.nvidia.com/Cg/Cg_language.html>. Acesso em 20 fev. 2013. CG Toolkit (2013). Disponvel em: < http://www.geeks3d.com/20091009/nvidia-cg-22-toolkit-available/>. Acesso em 15 fev. 2013. CUDA Programming Guide (2013). Disponvel em: <http://docs.nvidia.com/cuda/cudac-programming-guide/index.html#cuda-general-purpose-parallel-computingarchitecture>. Acesso em 17 fev. 2013. Garshol, L. M (2008). BNF and EBNF: What are they and how do they work?. Disponvel em: <http://www.garshol.priv.no/download/text/bnf.html>. Acesso em 02 mar. 2013. GPGPU CUDA (2013). Disponvel <http://moss.csc.ncsu.edu/~mueller/cluster/nvidia/>. Acesso em 14 fev. 2013. Gramtica da Linguagem C (2013). Disponvel www.cs.man.ac.uk/~pjj/bnf/c_syntax.bnf>. Acesso em 28 fev. 2013. em: em: <

Gramtica Livre de Contexto (2013). Disponvel em: <http://pt.wikipedia.org/wiki/Gramtica_livre_de_contexto>. Acesso em: 02 mar. 2013. McClanahan, C. (2011) History and Evolution of GPU Architecture. Disponvel em: <http://mcclanahoochie.com/blog/wp-content/uploads/2011/03/gpu-hist-paper.pdf>. Acesso em 02 fev. 2013. Menezes, P. F. B (2000). Linguagens formais e autmatos. Porto Alegre: Sagra Luzzatto, Instituto de Informtica da UFRGS.

Munshi, A. (2008). The OpenCL Specification. Disponvel em: <http://www.khronos.org/registry/cl/specs/opencl-1.0.29.pdf>. Acesso em 04 mar. 2013. NVidia CUDA. (2013). Disponvel em: <http://www.nvidia.com.br/object/cuda_home_new_br.html>. Acesso em 17 fev. 2013. Semntica (2013). Disponvel em: <http://pt.wikipedia.org/wiki/Semntica>. Acessado em: 02 mar. 2013. Semntica Formal (2013). Disponvel <http://pt.wikipedia.org/wiki/Semntica_formal>. Acesso em: 01 mar. 2013. em:

Silveira, C. L. B. Silveira Jr, L. G. Cavalheiro, G. G. H (2010). Programao em OpenCL: Uma introduo prtica. SBGames 2010 (IX Simpsio Brasileiro de Jogos e Entretenimento Digital) Sintaxe e Semntica (2013). Disponvel em: rio.br/~inf1621/sintaxe.pdf>. Acesso em: 02 mar. de 2013. <http://www.inf.puc-

The Graphics Pipeline (2013). Disponvel em: <http://encyclopedia2.thefreedictionary.com/3D+graphics+pipeline>. Acesso em 17 fev. 2013.

Você também pode gostar