<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Geek Vault &#187; introdução</title>
	<atom:link href="http://www.geekvault.org/tag/introducao/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.geekvault.org</link>
	<description>Because geeks, like to talk.</description>
	<lastBuildDate>Fri, 16 Jul 2010 12:47:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>CUDA: Supercomputadores em seu desktop</title>
		<link>http://www.geekvault.org/2010/01/cuda-supercomputadores-em-seu-desktop/</link>
		<comments>http://www.geekvault.org/2010/01/cuda-supercomputadores-em-seu-desktop/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 14:12:15 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[ANSI C]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[CUDA]]></category>
		<category><![CDATA[introdução]]></category>
		<category><![CDATA[paralelismo]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=481</guid>
		<description><![CDATA[Quem já programou em clusters (ou até mesmo utilizando paralelismo) sabe das enormes vantagens que o paralelismo pode trazer. O que poucas pessoas sabem é que você pode ter tudo isso na sua casa, programando em sua placa de vídeo nVidia utilizando CUDA, uma arquitetura de programação paralela genérica, disponibilizada Free pela nVidia. Diferente de [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F01%2Fcuda-supercomputadores-em-seu-desktop%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F01%2Fcuda-supercomputadores-em-seu-desktop%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Quem já programou em clusters (ou até mesmo utilizando paralelismo) sabe das enormes vantagens que o paralelismo pode trazer. O que poucas pessoas sabem é que você pode ter tudo isso na sua casa, programando em sua placa de vídeo nVidia utilizando CUDA, uma arquitetura de programação paralela genérica, disponibilizada Free pela nVidia.<br />
Diferente de várias formas de programação paralela, as placas da nVidia utilizam muito mais transistores para para processamento de dados no lugar de memória, dessa forma temos o chamado SIMT(Single Instruction Multiple Threads), não vou explicar exatamente como o CUDA faz ou até mesmo como programar para CUDA agora (mais tarde sem dúvida vou colocar algum código bem explicado, mas o tempo está cada vez mais escasso). Basta falar que em uma GeForce 8500GT temos 16 cores separados em 2 processadores, e uma GTX280 conta com 280 cores, o que a nVidia fez que é extremamente elegante, foi separar o número de threads possíves pela quantidade de memória a ser processada, e não pela quantidade de processadores, dessa forma você tem uma escalabilidade praticamente perfeita.<br />
Explicando um pouco melhor isso, para rodar algo em uma GPU utilizando CUDA você precisa criar um Grid de execução, cada Grid possui um conjunto de Blocks (blocos de threads) e cada Block possui um número <em>n</em> de threads que é ditado pela quantidade de dados a ser processado. Mais interessante ainda é que cada bloco de thread possui um espaço de memória do tipo <em>shared </em>(compartilhada) que é extremamente rápida, porém apenas as threads daquele bloco podem acessar esse espaço de memória. Além disso existe a memória do tipo global, que fica toda na GPU e qualquer thread (ou bloco) pode acessar, e outros tipos (constant, register, local e texture).<br />
Bom, esse não é nem o básico sobre CUDA, é apenas um texto para dar um gostinho de quero mais. Um pequeno teste que fiz foi portar o algoritmo de ordenação <a href="http://en.wikipedia.org/wiki/Bitonic_sorter" target="_blank">Bitonic Sort</a> para CUDA (código retirado dessa <a href="http://forums.nvidia.com/index.php?showtopic=84651&amp;hl=Bitonic" target="_blank">thread</a> do <a href="http://forums.nvidia.com/index.php?showforum=62" target="_blank">Forum da nVidia</a>), e comparar a versão sem paralelismo com a versão do CUDA, pois bem, o programa faz isso:</p>
<ol>
<li>Cria um array de 2^25 números = 33.554.432</li>
<li>Copia a memória para a GPU (apnas na versão CUDA)</li>
<li>Popula o array com o indíce invertido (array[0]=33554432, &#8230;, array[33554432]=0)</li>
<li>Ordena utilizando o algoritmo Bitonic Sort</li>
<li>Copia de GPU para a memória local de volta (apenas na versão CUDA)</li>
<li>Valida os dados</li>
</ol>
<p>na versão simples (sem paralelismo) tudo isso demorou em média 4 minutos e meio para executar, na versão CUDA demorou 0.3 segundos em uma GeForce 8500GT. Isso convence do poder do CUDA?</p>
<p>Para saber mais:</p>
<p><a href="http://www.google.com.br/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;ved=0CAkQFjAA&amp;url=http%3A%2F%2Fwww.nvidia.com%2Fobject%2Fcuda_home.html&amp;ei=CTFLS97iLcjRlAefwKGKDQ&amp;usg=AFQjCNG1zNZv61fSdyiINfawS6rkA6z5xw&amp;sig2=3de3ZGegXoVKeF9Zq3Rpag" target="_blank">CUDA Zone</a>: Site oficial com uma extensa documentação sobre o CUDA<br />
<a href="http://www.ddj.com/architect/207200659" target="_blank">Dr.Dobbs</a>: Tutorial fantástico sobre CUDA</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2010/01/cuda-supercomputadores-em-seu-desktop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
