• Nenhum resultado encontrado

O surgimento da Unidade Gr´afica de Processamento, do inglˆes Graphics Processing Unit (GPU), remete ao final da d´ecada de 1980 e in´ıcio da d´ecada de 1990, quando come¸caram a se popularizar os sistemas operacionais com interfaces gr´aficas, no- meadamente o sistema Windows da Microsoft, pois os usu´arios passaram a com- prar aceleradores gr´aficos 2D para seus computadores pessoais, os quais ofereciam opera¸c˜oes de bitmap via hardware e melhoravam a usabilidade gr´afica dos sistemas. J´a na metade dos anos 90, a demanda dos consumidores cresceu rapidamente em rela¸c˜ao a aplica¸c˜oes gr´aficas em trˆes dimens˜oes (3D), liderada principalmente pelo mercado de games, com o lan¸camento de jogos imersivos em “primeira-pessoa” como

Figura 3.1: Fatia de participa¸c˜ao dos coprocessadores de acelera¸c˜ao nos 75 supercom- putadores que utilizam tal tecnologia, constantes na lista do TOP500 de novembro de 2014 [38].

Doom, Duke Nukem 3D, Quake, e Wolfenstein 3D. Aliado a isso, empresas como NVIDIA e ATI Technologies lan¸cavam no mesmo per´ıodo aceleradores gr´aficos a pre¸cos acess´ıveis, o que atraiu grande aten¸c˜ao e fez com que a tecnologia de gr´aficos 3D obtivesse destaque nos anos seguintes [4].

Nessa ´epoca, as GPUs consistiam em um hardware de fun¸c˜ao fixa que n˜ao podia ser programado de forma gen´erica, e operava em uma sequˆencia de passos reali- zando opera¸c˜oes gr´aficas sobre os dados, em uma estrutura conhecida como pipeline gr´afico. O acesso a estas GPUs era feito utilizando-se APIs (Application Program- ming Interface) como a DirectX da Microsoft e a OpenGL, que possibilitavam `as aplica¸c˜oes apenas enviar comandos predefinidos `as GPUs para que desenhassem objetos na tela do monitor. O trabalho b´asico do pipeline gr´afico era desenhar (ou renderizar) triˆangulos, de modo que a superf´ıcie de um objeto fosse representada por uma cole¸c˜ao de triˆangulos, e para tanto, continha tipicamente os seguintes est´agios: controle de v´ertices (vertex control ); ilumina¸c˜ao, transforma¸c˜ao e sombreamento de v´ertices (vertex shading, transform and lighting); configura¸c˜ao do triˆangulo (triangle setup); rasteriza¸c˜ao (raster ); sombreamento (shader ); e refinamento de rasteriza¸c˜ao (raster operation ROP ). Maiores detalhes da dinˆamica e fun¸c˜ao dos est´agios podem ser encontrados em [25].

Com o passar do tempo, a evolu¸c˜ao das GPUs ocorreu via incremento das fun- cionalidades dos v´arios est´agios do pipeline gr´afico, atrav´es da introdu¸c˜ao de novos recursos de hardware e novas configura¸c˜oes. Contudo, a demanda dos desenvol-

vedores foi ficando cada vez mais sofisticada e as novas carater´ısticas requisitadas n˜ao podiam mais ser atendidas por um hardware com fun¸c˜oes fixas, o que levou a evolu¸c˜ao a tomar o caminho de tornar program´aveis alguns est´agios do pipeline. Foi ent˜ao que em 2001, a NVIDIA lan¸cou a fam´ılia de GPUs chamada GeForce 3, sendo a pioneira a disponibilizar um dispositivo em que alguns dos est´agios do pipeline gr´afico, como o de v´ertices e de sombreamento, podiam ser programados pelos de- senvolvedores, tendˆencia seguida nos anos seguintes com a cria¸c˜ao de novas fun¸c˜oes program´aveis, tanto pela pr´opria NVIDIA quanto por outras fabricantes, como ATI e at´e mesmo pela Microsoft com o lan¸camento de seu console de games XBox 360 que permitia os est´agios de sombreamento de v´ertices e pixels serem executados em um ´unico processador gr´afico [25].

O surgimento da possibilidade de programa¸c˜ao do pipeline das GPUs atraiu mui- tos pesquisadores que compartilhavam a ideia de utilizar este tipo de processador para outras finalidades que n˜ao somente a renderiza¸c˜ao gr´afica, guiados principal- mente pelo fato da alta taxa de c´alculos aritm´eticos que estes dispositivos eram capazes de realizar (pois trabalhavam com milh˜oes de v´ertices e pixels). Entretanto, a ´unica forma de intera¸c˜ao com as GPUs ainda era somente as APIs DirectX e OpenGL, o que complicava a express˜ao de problemas gen´ericos, visto que os mes- mos deviam ser modelados pelos programadores de forma a parecerem problemas de renderiza¸c˜ao gr´afica a fim de serem executados pelas GPUs. Para contornar este obst´aculo, foi lan¸cada no ano de 2006 pela NVIDIA a GPU GeForce 8800 GTX, que foi a primeira constru´ıda com suporte `a nova arquitetura criada pela corpora¸c˜ao chamada de CUDA (ser´a detalhada na Se¸c˜ao 3.3), a qual tinha como objetivo expor as GPUs para programa¸c˜ao de prop´osito geral sem impor as restri¸c˜oes das anti- gas unidades gr´aficas. Al´em da cria¸c˜ao da arquitetura em si, no in´ıcio de 2007 a NVIDIA lan¸cou tamb´em um compilador para uma nova linguagem de programa¸c˜ao baseada em algumas extens˜oes sobre a linguagem C, chamada de CUDA C, a fim de facilitar a explora¸c˜ao da capacidade de processamento das novas GPUs. A partir de ent˜ao, os programadores n˜ao precisaram mais ter nenhum conhecimento sobre as APIs gr´aficas de programa¸c˜ao, nem tampouco necessitavam expressar seus progra- mas “disfar¸cados” de problemas de computa¸c˜ao gr´afica [4].

Devido ao in´ıcio do uso das GPUs em aplica¸c˜oes com outras finalidades que n˜ao a computa¸c˜ao gr´afica, surgiu um novo conceito chamado de GPU Computing ou GPGPU (General Purpose Graphics Processing Unit ), que se concentrou na uti- liza¸c˜ao das GPUs para computa¸c˜oes de prop´osito geral. At´e mesmo a placa de hardware em si, algumas vezes passou a ser chamada de GPGPU ao inv´es de ape- nas GPU, quando utilizada neste novo contexto de aplica¸c˜oes4. Deste momento

4Continuaremos utilizando o termo GPU no restante do trabalho, ainda que nosso uso tenha sido para computa¸c˜ao de prop´osito geral.

em diante, o uso das GPUs cresceu vertiginosamente nos mais diversos campos de aplica¸c˜ao, sendo na maioria dos casos utilizadas a tecnologia CUDA e as placas de hardware da NVIDIA, que desde ent˜ao vem evoluindo e adicionando novas funciona- lidades aos seus produtos, liberando novas arquiteturas em per´ıodos de dois em dois anos aproximadamente (ver Subse¸c˜ao 3.3.4). Exemplos de aplica¸c˜oes que se benefi- ciaram, e ainda se beneficiam do uso das GPUs devido seu alto poder computacional s˜ao: modelagem molecular, sistemas financeiros, simula¸c˜ao de reservat´orios de ´oleo e g´as, simula¸c˜ao de n-corpos (n-body simulation), sistemas m´edicos por imagem, dinˆamica dos fluidos, e sistemas de modelagem ambiental [4, 25].

O caminho natural ´e que as GPUs sejam cada vez mais empregadas para a re- solu¸c˜ao de muitas classes de problemas, principalmente aqueles que demandam um alto poder computacional. Conforme vimos na Subse¸c˜ao 3.1.3, atualmente as GPUs vem de fato sendo bastante utilizadas em supercomputadores de alto desempenho na fun¸c˜ao de coprocessadores de acelera¸c˜ao, em ambientes que as utilizam em grande n´umero de forma distribu´ıda e paralela, como por exemplo clusters de computadores, nos quais cada n´o possui uma ou mais GPUs agregadas, levando a uma estrutura de m´ultiplas GPUs chamado de Multi-GPU. Desta forma, a tendˆencia para o fu- turo ´e que as GPUs continuem passando por vigorosas evolu¸c˜oes arquiteturais, com t´ecnicas cada vez mais agressivas sendo introduzidas nas novas gera¸c˜oes, visando aumentar a eficiˆencia de utiliza¸c˜ao das unidades de c´alculo aritm´etico, permitindo assim que os desenvolvedores prossigam com novas descobertas e implementa¸c˜oes de novas otimiza¸c˜oes para a resolu¸c˜ao de seus problemas [25].