UM ESTUDO SOBRE A GPU COMPUTING PARA APLICAÇÕES EM SISTEMAS MAGNÉTICOS NANOESTRUTURADOS

Share Embed


Descrição do Produto

Anais do VIII SIC

319

UM ESTUDO SOBRE A GPU COMPUTING PARA APLICAÇÕES EM SISTEMAS MAGNÉTICOS NANOESTRUTURADOS Serafim do Nascimento Júnior; Ana Lúcia Dantas RESUMO: O objetivo da pesquisa foi estudar a tecnologia CUDA, uma arquitetura de programação paralela de alto desempenho presente nas unidades de processamento gráfico (GPUs) da NVIDIA, com o intuito de futuramente aproveitar o poder computacional das GPUs, por meio de sua extensão da linguagem C e/ou FORTRAN, para simulação de sistemas físicos de ordem de grandeza bem pequena, especificamente, a nível nanométrico. Isso é possível porque hoje essas GPUs são unidades de processamento de propósito geral, possibilitando a execução de aplicações não-gráficas, como simulações científicas. No início do projeto, após a participação em um minicurso na UFPB que retratava a GPU Computing, foi realizado um levantamento bibliográfico a respeito dessa tecnologia para que pudéssemos estudar as técnicas de programação em GPU utilizando a arquitetura CUDA e sua extensão da linguagem C, além dos requisitos de hardware e os softwares necessários para esse tipo de programação. Os materiais coletados para o estudo foram livros, artigos científicos e técnicos, dissertações de mestrado, as ferramentas computacionais requeridas para esse tipo de programação, entre outros e a forma de coleta dos mesmos ocorreu por meio de sites e da biblioteca da universidade. Com o estudo realizado nos foi concluído que se a GPU Computing reduz significativamente o tempo de processamento dos algoritmos no que se refere a CPU, logo se faz necessário dominar essas técnicas para usá-las na simulação computacional de sistemas físicos de ordem de grandeza de baixa escala métrica. PALAVRAS-CHAVE: CUDA; Computação Científica; Computação Paralela e de Alto Desempenho; Física Computacional; GPU Computing. INTRODUÇÃO A computação de propósito geral sobre as unidades de processamento gráfico, mais conhecida como GPU Computing, está ganhando cada vez mais espaço na área acadêmica, em virtude do alto poder computacional propiciado nesse tipo de programação. A necessidade de diminuir o tempo computacional, componente importante na simulação de algoritmos de sistemas físicos de ordem de grandeza muito pequena e em outros tipos de simulação científica, está fazendo com que os cientistas procurem por novas técnicas computacionais que possibilitem otimizar o tempo de execução de seus programas de maneira eficaz , permitindo a visualização mais rápida dos resultados e proporcionando agilidade na verificação da corretude dos dados gerados nas simulações, assim como avanços mais rápidos nas pesquisas, além de outros benefícios. Foi pensando nisso, que entre o final de 2006 e início de 2007, a NVIDIA lançou no mercado a tecnologia CUDA, uma arquitetura para as suas unidades de processamento gráfico que é unificada para calcular dados numéricos, apresentando duas interfaces de programação mutuamente exclusivas: C for CUDA e CUDA Driver API, respectivamente, alto e baixo nível. Foram criadas para facilitar o aprendizado desse tipo de programação, graças à baixa curva de aprendizado, principalmente na primeira interface. Outras interfaces de programação já estão sendo suportadas pelas GPUs NVIDIA, tais como: FORTRAN, C++, OpenCL, DirectX Compute e Java, porém muitas delas ainda estão em fase de desenvolvimento. A Compute Unified Device Architecture – CUDA é uma arquitetura de programação paralela de propósito geral que, como o nome informa e já foi um pouco explicitado, está associada à unidade de processamento gráfico que, apesar de ter sido desenvolvida com o objetivo de atingir a

ISBN 978-85-7621-051-1

Anais do VIII SIC

320

renderização gráfica, hoje também é utilizada para o processamento paralelo de alto desempenho de algoritmos numéricos, permitindo a execução dos mesmos pelo seu processador gráfico que tem uma potência inúmeras vezes maior do que a unidade central de processamento. De maneira mais geral, Ikeda (2011, p. 29) dá um conceito mais formal para esse tipo de arquitetura: Acrônimo para Compute Unified Device Architecture, o CUDA é um modelo de programação paralela para uso geral de GPUs, criado pela NVIDIA em 2007 e inicialmente disponível na série GeForce 8. Foi um avanço da empresa no GPGPU e na computação de alto desempenho, com o benefício da maior facilidade de uso.

A Computação sobre a GPU está auxiliando em inúmeras áreas da Ciência por meio da tecnologia CUDA, uma arquitetura que torna fácil o uso da Computação Paralela, permitindo assim a execução de algoritmos com maior velocidade temporal. Algumas das áreas que mais trabalham com GPU Computing atualmente são: Ciência Ambiental, Medicina (em Imagens Médicas), Simulação de Dinâmicas de Fluídos e Física Computacional. Consoante Sanders e Kandrot (2010, p. 10) em relação à Ciência Ambiental, O crescente interesse no que se referem às mudanças climáticas, os altos preços de combustíveis e o aumento elevado na poluição do planeta, tanto no ar quanto nas águas, colocaram em pauta os danos colaterais que os avanços da indústria proporcionaram. Os agentes de limpeza e detergentes continuam sendo um dos produtos de consumo potencialmente prejudiciais em uso regular. Como resultado, muitos cientistas tem começado a explorar métodos para a redução do impacto ambiental assim como de detergentes sem a redução de sua eficácia. [...] A introdução de simulações de computador não serve apenas para acelerar uma abordagem de laboratório tradicional, mas estende-se a amplitude de teste para numerosas variantes das condições ambientes, muito mais do que poderiam ser praticamente testadas no passado.

Na área de Imagens Médicas, o uso se dá em simulações de imagens tridimensionais em técnicas de Ultrassonografia, que são mais requeridas pelos Médicos pelo fato de serem mais seguras para os indivíduos do que os Raios-X. Antes o limite computacional, principalmente em relação ao tempo de execução dos algoritmos que realizam essas simulações, inviabilizava a criação dessas imagens, porém com o surgimento da arquitetura CUDA associado ao poder computacional das GPUs e a possibilidade de computar paralelamente os algoritmos de maneira mais fácil, hoje é possível obter as imagens rapidamente. Com a GPU Computing, a pesquisa em Simulações de Dinâmicas de Fluídos está se beneficiando, pois conforme Sanders e Kandrot (2010, p. 9), Tempos atrás o projeto de rotores e lâminas altamente eficientes estava deixado de lado, pela dificuldade na modelação eficiente - por meio de formulações simples - dos movimentos complexos do ar e de fluídos em volta desses dispositivos, pois a precisão computacional para a realização dessas simulações era e ainda são muito caras computacionalmente, por isso antes, somente os melhores supercomputadores do mundo poderiam oferecer os recursos computacionais necessários para que as simulações nesses sistemas se tornassem as mais realísticas possíveis.

Sendo assim, a Computação em GPUs está levantando as pesquisas em dinâmicas de fluídos, pois com esse novo modo de programação é possível ter um supercomputador em casa e assim tornar mais rápido o desenvolvimento e a execução dessas aplicações científicas. Em Física Computacional, nossa área de pesquisa e estudos, a GPU Computing auxiliará no aumento do processamento dos algoritmos numéricos que estamos trabalhando, em busca de melhor desempenho temporal na execução dos mesmos, pois os recursos computacionais que dispomos para executar nossos programas, mesmo sendo excelentes CPUs, demoram bastante tempo para retornar os resultados, tornando as pesquisas mais lentas. Se referindo a Ciência Ambiental, mas que também está valendo para todas as áreas que necessitam da GPU Computing, Sanders e Kandrot (2010, p.11) citam que “desde que a CUDA da NVIDIA tem reduzido o tempo de execução de simulações completas de várias semanas para poucas horas, os anos a vir devem oferecer um aumento dramático em produtos que tenham eficácia aumentada e impacto ambiental reduzido.”

ISBN 978-85-7621-051-1

Anais do VIII SIC

321

David B. Kirk, autor de um dos livros mais influentes do mundo em Computação Paralela, nesse ano abriu o primeiro dia da Conferência Internacional de Computação, em Curitiba, que foi promovida pela mesma empresa que integra o 32° Congresso da Sociedade Brasileira de Computação – CSBC. Nesse evento ele ressaltou que A computação em GPU irá revolucionar a Ciência, pois mesmo uma CPU com vários cores, capaz de fazer inúmeras funções, não consegue processar grandes quantidades de dados de forma rápida. A GPU tem outra arquitetura e possui centenas de cores para auxiliar no processamento de uma quantidade grande de informação (Em: . Acesso em: 23 de agosto de 2012).

Como podemos ver, a Computação sobre as unidades de processamento gráfico motiva inúmeras áreas que requerem alto processamento em algoritmos que demandam uma grande quantidade de informações, pois ela provê a obtenção rápida dos resultados em suas simulações e com isso a finalização dos trabalhos de pesquisa se torna mais rápida. A procura por essa tecnologia se dá por esse motivo, pois com a otimização do tempo de processamento dos algoritmos executados na GPU, o desejo das áreas que requerem a execução rápida de algoritmos é satisfeito. Com tudo, o estudo da programação sobre as GPUs NVIDIA utilizando a arquitetura CUDA e sua interface de programação C/FORTRAN for CUDA para auxiliar nesse tipo de computação é necessária para reduzir o tempo de processamento dos algoritmos utilizados em nosso projeto, sendo por esse motivo que o estudo sobre a GPU Computing foi realizado. MATERIAL E MÉTODOS No início do projeto, após a participação em um mini-curso relacionado à GPU Computing que foi ministrado na Universidade Federal da Paraíba, foi realizado um levantamento bibliográfico para encontrar material de estudo para que pudéssemos desbravar a tecnologia CUDA e aprender as técnicas de programação sobre as unidades de processamento gráfico da NVIDIA. A pesquisa bibliográfica, feita por meio da internet e de livros que retratam o tema em questão, foi o principal procedimento para o desenvolvimento do projeto, pois foi essa a maneira mais prática para encontrar os principais materiais de estudo. Com as pesquisas, descobrimos que alguns dos principais livros para estudo da GPU Computing são: CUDA BY EXAMPLE An Introduction to General-Purpose GPU Programming, Programming Massively Parallel Processors A hands on Approach, CUDA C Programming Guide, CUDA C Best Practices Guide, CUDA Reference Manual e CUDA Fortran Programming Guide and Reference, dos quais os autores se encontram nas referências. Por meio deles é possível conseguir uma base de conhecimento bem sólida tanto sobre a GPU Computing quanto a respeito da Computação Paralela, pois essas subáreas da Computação se relacionam. Além dos materiais de estudo citados, foram estudados inúmeros artigos científicos e técnicos, tanto aqueles que descrevem a GPU Computing de alguma maneira como os que utilizaram essa tecnologia para obter melhor desempenho em simulações de algoritmos complexos, sendo isso feito com o intuito de sabermos as áreas onde essa nova abordagem da computação está sendo usada. Para programar sobre uma GPU NVIDIA que contempla a CUDA é necessário que o seu computador apresente uma dessas placas gráficas, onde no mínimo ela seja um GeForce 8. Sendo assim, também contam como materiais de estudo os softwares necessários para se programar em CUDA, tais como: o driver atualizado da placa de vídeo NVIDIA, versões atuais do CUDA Toolkit (quite de ferramentas CUDA), o GPU Computing SDK (quite de desenvolvimento de software) e um ambiente de programação, como o Microsoft Visual C++ 2010, que permita a compilação de algoritmos escritos em C/C++ que utilizam as técnicas da CUDA para a programação sobre a GPU.

ISBN 978-85-7621-051-1

Anais do VIII SIC

322

Em relação ao ambiente de programação, ele deve apresentar a mesma arquitetura (32 ou 64 bits) do CUDA Toolkit, caso contrário, no momento da execução dos algoritmos será apresentado um erro. Descobrimos que outro requisito para programar sobre a GPU é ter o conhecimento sobre a arquitetura da mesma, pois as placas gráficas, partindo daquelas da série GeForce 8 até a Tesla, apesar de suportarem a CUDA, apresentam configurações diferentes. A Fermi foi a arquitetura das placas gráficas NVIDIA estudada no projeto, pois a maioria das placas apresentam essa arquitetura e a configuração da mesma varia dependendo da placa. Esse estudo é importante, porque segundo Ikeda (2011, p. 22), “A mais recente geração de GPUs da NVIDIA, com a arquitetura Fermi, introduz diversas funcionalidades que entregam melhor desempenho, melhora a forma de programação empregada e amplia a variedade de aplicações que podem se beneficiar dela”. As características da mesma serão explicitadas brevemente com base na figura abaixo:

Figura 1. Representação básica da arquitetura Fermi. Analisando a Figura 1, percebemos que arquitetura Fermi apresenta 16 multiprocessadores, onde cada um apresenta: 32 núcleos CUDA, local onde as threads são executadas; quatro unidades para execução de funções especiais como seno, cosseno, tangente entre outras; 16 unidades para carregamento e armazenamento de dados; uma unidade para arquivamento de registradores; duas unidades para agendar warps; duas unidades de despache; uma memória cache de instruções; uma rede de interconexão; uma memória compartilhada e uma cache L1; e uma memória cache uniforme. Além dos multiprocessadores e sua parte interna, externamente também estão presentes nessa arquitetura os seguintes componentes: uma memória cache L2, que é compartilhada por todos

ISBN 978-85-7621-051-1

Anais do VIII SIC

323

os multiprocessadores; seis interfaces de memória DRAM de 64 bits; uma interface que possibilita a comunicação com a unidade central de processamento; e um escalonador de threads, que as distribui para os multiprocessadores que estiverem disponíveis e permite a execução paralela de inúmeros kernels (programas que são executados na GPU) quando possível. Nessa arquitetura, cada multiprocessador pode executar até 1536 threads concorrentemente e quando um bloco termina sua tarefa, ele libera os recursos que utilizava, para que o escalonador encontre outro bloco de thread inativo que possa usar os recursos do multiprocessador que ficou livre. Além de tudo que foi abordado até o momento, também foi estudado o modelo de programação ao qual a GPU Computing é baseado, o Stream Processing, que em Português significa processamento de threads, e que constitui consoante Ikeda (2012, p. 29), “uma forma simples e restrita de paralelismo em que não há necessidade de coordenar a comunicação nem de sincronização explícita, sendo ideal para aplicações com alta demanda aritmética e dados paralelos”. Esse modelo é escalável, possibilitando de maneira uniforme o crescente volume de kernels para manipulação sobre a GPU. Zibula apud Ikeda (2010, p. 35) ressalta que “o gerenciamento automático das threads reduz de forma significativa a complexidade da computação paralela, permitindo definir explicitamente o paralelismo de determinadas partes do código”. Com o estudo sobre o modelo de programação, pudemos aprender e entender algumas técnicas de programação em GPU, tanto em C quanto em Fortran, pelo fato de terem sido estudados os guias de referência e de programação em CUDA das extensões dessas linguagens, e algumas dessas técnicas serão apresentadas na próxima seção. RESULTADOS E DISCUSSÃO Como resultado do estudo sobre essa nova abordagem de computação, foi possível entender e aprender algumas técnicas computacionais para se programar sobre uma GPU NVIDIA que apresente a CUDA. Um programa desenvolvido para ser executado pela GPU, não será processado por completo na mesma, pois em GPU Computing os programas elaborados são heterogêneos, ou seja, partes do código são rodadas na CPU e outras na GPU. Nesses algoritmos, todo módulo que apresentar a palavra mágica host na sua definição, a execução do mesmo acontecerá sobre a CPU e caso apresente as palavras, device ou global, o processamento desses acontecerá sobre a GPU. Antes de apresentarmos os exemplos de programas que usam as técnicas ressaltadas no primeiro parágrafo é muito importante aprender o fluxo que um programa escrito em CUDA apresenta. Esse fluxo ocorre da seguinte maneira: · O código do host inicializa um determinado vetor com dados; · É feita uma cópia desse vetor na memória do host para ser colocada na memória do device; · São realizados cálculos sobre o vetor de dados pelo device; · O vetor do device que está com os dados modificados é copiado novamente para o host. Todos os algoritmos escritos em CUDA seguem esse fluxo para que os benefícios de desempenho possam ser obtidos e com os comandos que permitem a realização desse fluxo, isso se torna possível. Na programação em CUDA, as funções que serão executadas na GPU são chamadas de kernels e as mesmas apresentam o especificador global antes do nome do módulo, em C ele é escrito __global__ e em FORTRAN attributes(global), se em um algoritmo uma função ou subrotina não apresentar esse especificador, automaticamente o compilador entenderá a mesma como um kernel.

ISBN 978-85-7621-051-1

Anais do VIII SIC

324

Um kernel especifica uma parte do programa a ser executada N vezes em paralelo por N diferentes threads na GPU. No caso dos fragmentos que serão executados na CPU, os mesmos apresentam o especificador host, sendo em C __host__ e em FORTRAN attributes(host). Ikeda (2011, p. 36) ressalta que o modelo de programação estimula a divisão dos problemas em dois passos: · Separá-los em subproblemas independentes, formando os grids; · Depois dividi-los em blocos independentes de mesmo tamanho (thread blocks), onde as threads podem trabalhar de forma cooperativa e compartilham uma memória somente visível entre elas. Para melhor entender essa divisão apresentamos abaixo uma figura retirada do Guia de Programação da NVIDIA CUDA:

Figura 2. Grid e blocos de thread. A figura 2 mostra o momento após a execução de um algoritmo escrito em CUDA, onde os dados que serão processados são organizados em um grid que é constituído de blocos de thread e cada um desses blocos constitui-se de inúmeras threads, que são as tarefas que serão executadas pela GPU. Abaixo apresentamos um código escrito em CUDA C que realiza a soma de dois vetores armazenando o resultado em um terceiro vetor e em seguida explicamos alguns fragmentos do mesmo.

ISBN 978-85-7621-051-1

Anais do VIII SIC

325

Figura 3. Algoritmo que soma dois vetores, baseado em Sanders e Kandrot (2010, p. 67-68). Na quarta linha desse código é calculado o identificador de uma thread que esteja inativa na GPU e que servirá de índice para os vetores que estão alocados na mesma. Dentro do laço que começa na quinta linha, após a primeira soma, os identificadores de thread são atualizados à medida que o laço é incrementado para que a soma dos demais elementos do vetor aconteça. Em todos os kernels que criarmos, teremos que encontrar os identificadores das threads disponíveis para que se possa acontecer o processamento paralelo. Na linha 37 vemos a chamada desse kernel. Com base nos estudos realizados, percebemos que a GPU Computing com CUDA é uma tecnologia que proverá a execução rápida dos algoritmos numéricos que trabalhamos, possibilitando aumentos significativos em nossas pesquisas. Portanto, para atingirmos esse objetivo é necessário se aprofundar nessas técnicas saindo da teoria partindo para a programação.

ISBN 978-85-7621-051-1

Anais do VIII SIC

326

CONCLUSÃO Concluímos que, com o conhecimento obtido a respeito das técnicas de programação com a CUDA sobre as unidades de processamento gráfico da NVIDIA, será possível aperfeiçoar-se cada vez mais nesse estudo, para que com isso possamos colocá-las em prática e começar a programar usufruindo dos recursos dessa nova abordagem da computação, a GPU Computing, e assim alavancar nossas pesquisas. AGRADECIMENTOS A Deus, por estudar na Universidade do Estado do Rio Grande do Norte e ter colocado no meu caminho a Dra. Ana Lúcia Dantas, minha Orientadora e Professora, para permitir a minha participação em seus projetos de pesquisa financiados pelo Conselho Nacional de Desenvolvimento Científico e Tecnológico – CNPQ e contribuirão de maneira significativa na minha careira acadêmica. REFERÊNCIAS CARAPETO, Ricardo R.; FRANCISCO, Silas M.; MAURÍCIO João G. Programação em GPU: CUDA, CTM (NOV 2007). Disponível em: . Acesso em: 20 de fev. 2012, 08:55:01. IKEDA, Patricia Akemi. 2011. 80 f. Um estudo do uso eficiente de programas em placas gráficas. Dissertação. (Mestrado em Ciência da Computação) – Universidade de São Paulo, São Paulo, 2011. KIRK, David B.; HWU Wen-mei W. Programming Massively Parallel Processors: A Hands-on Approach. Burlington: Elsevier, 2010. NVIDIA. Disponível em: . Acesso em: 30 de mai. 2012, 12:35. NVIDIA. Disponível em: . Acesso em: 20 de jul. 2012, 15:43. SANDERS, Jason; KANDROT, Edward. CUDA BY EXAMPLE: An Introduction to GeneralPurpose GPU Programming. First printing. Michigan: Pearson, 2010. VIANA, José Ricardo Mello. Programação em GPU: Passado, presente e futuro. Disponível em: . Acesso em: 20 de fev. 2012, 09:12:27.

ISBN 978-85-7621-051-1

Lihat lebih banyak...

Comentários

Copyright © 2017 DADOSPDF Inc.