<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>GPUBrasil &#187; cookbook</title>
	<atom:link href="http://gpubrasil.com/category/cookbook/feed/" rel="self" type="application/rss+xml" />
	<link>http://gpubrasil.com</link>
	<description>Porque nós ficamos com as galinhas.</description>
	<lastBuildDate>Sat, 07 Aug 2010 04:41:05 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='gpubrasil.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/da575ef40bb222b2f66e657599f35884?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>GPUBrasil &#187; cookbook</title>
		<link>http://gpubrasil.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://gpubrasil.com/osd.xml" title="GPUBrasil" />
	<atom:link rel='hub' href='http://gpubrasil.com/?pushpress=hub'/>
		<item>
		<title>Comparação GPU x sistemas paralelos</title>
		<link>http://gpubrasil.com/2009/12/15/comparacao-gpu-x-sistemas-paralelos/</link>
		<comments>http://gpubrasil.com/2009/12/15/comparacao-gpu-x-sistemas-paralelos/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 11:51:50 +0000</pubDate>
		<dc:creator>Labaki</dc:creator>
				<category><![CDATA[acadêmico]]></category>
		<category><![CDATA[cookbook]]></category>

		<guid isPermaLink="false">http://gpubrasil.com/?p=222</guid>
		<description><![CDATA[Monografia de conclusão de curso de A. V. Grammelsbacher e J. C. C. Medrado. O trabalho visa fornecer um estudo comparando a execução de algoritmos paralelos na CPU e na GPU, elucidando se é mais vantajoso executar determinados algoritmos na CPU ou na GPU. Para realizar as comparações são feitos benchmarks da execução de algoritmos [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gpubrasil.com&amp;blog=9721039&amp;post=222&amp;subd=gpubrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Monografia de conclusão de curso de A. V. Grammelsbacher e J. C. C. Medrado.</p>
<p style="text-align:justify;">O trabalho visa fornecer um estudo comparando a execução de algoritmos paralelos na CPU e na GPU, elucidando se é mais vantajoso executar determinados algoritmos na CPU ou na GPU. Para realizar as comparações são feitos benchmarks da execução de algoritmos com a finalidade de medir a capacidade de processamento em FLOPS , a cópia de dados na memória entre outras características do sistema.</p>
<p style="text-align:justify;"><a href="http://gpubrasil.files.wordpress.com/2009/12/comparacao-de-desempenho-entre-gpgpu-e-sistemas-paralelos.pdf">Comparacao de desempenho entre GPGPU e Sistemas Paralelos</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gpubrasil.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gpubrasil.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gpubrasil.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gpubrasil.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gpubrasil.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gpubrasil.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gpubrasil.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gpubrasil.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gpubrasil.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gpubrasil.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gpubrasil.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gpubrasil.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gpubrasil.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gpubrasil.wordpress.com/222/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gpubrasil.com&amp;blog=9721039&amp;post=222&amp;subd=gpubrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gpubrasil.com/2009/12/15/comparacao-gpu-x-sistemas-paralelos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b0ea1e9e7746ea823e164457c495d20c?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">Labaki</media:title>
		</media:content>
	</item>
		<item>
		<title>Medição de tempo</title>
		<link>http://gpubrasil.com/2009/10/02/medicao-de-tempo/</link>
		<comments>http://gpubrasil.com/2009/10/02/medicao-de-tempo/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 20:24:32 +0000</pubDate>
		<dc:creator>Labaki</dc:creator>
				<category><![CDATA[cookbook]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://gpubrasil.wordpress.com/?p=67</guid>
		<description><![CDATA[Freqüentemente precisamos medir o tempo de execução de um programa, especialmente quando queremos mostrar que um programa em GPU é mais rápido que um em CPU. A maioria das funções que a linguagem C oferece não servem a esse propósito, já que medem o tempo em segundos, e um programa para GPU raramente completa um [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gpubrasil.com&amp;blog=9721039&amp;post=67&amp;subd=gpubrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Freqüentemente precisamos medir o tempo de execução de um programa, especialmente quando queremos mostrar que um programa em GPU é mais rápido que um em CPU. A maioria das funções que a linguagem C oferece não servem a esse propósito, já que medem o tempo em segundos, e um programa para GPU raramente completa um segundo de execução. As bibliotecas CUDA oferecem um recurso simples para fazer essa medição, em unidades de milissegundos. Eis um exemplo de código:</p>
<p style="text-align:justify;">
<p><span style="font-family:courier;"> </span></p>
<p style="text-align:justify;">
<p style="text-align:justify;">
<p style="text-align:justify;"><span style="color:#ff0000;"><span style="font-family:courier;"># include &lt;stdlib.h&gt;</span></span></p>
<p style="text-align:justify;"><span style="color:#ff0000;"><span style="font-family:courier;"># include &lt;stdio.h&gt;</span></span></p>
<p style="text-align:justify;"><span style="color:#ff0000;"><span style="font-family:courier;"># include &lt;cutil.h&gt;</span></span></p>
<p style="text-align:justify;"><span style="font-family:courier;">int main()</span></p>
<p style="text-align:justify;"><span style="font-family:courier;">{</span></p>
<p style="text-align:justify;padding-left:30px;"><span style="font-family:courier;">float tempo;</span></p>
<p style="text-align:justify;padding-left:30px;"><span style="font-family:courier;">unsigned int timer = 0;</span></p>
<p style="text-align:justify;padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL( cutCreateTimer( &amp;timer));</span></p>
<p style="text-align:justify;padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL( cutStartTimer( timer));</span></p>
<p style="text-align:justify;padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// Região de execução: aqui vai o trecho de código cujo</span></span></p>
<p style="text-align:justify;padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// tempo de execução queremos medir.</span></span></p>
<p style="text-align:justify;padding-left:30px;"><span style="font-family:courier;">tempo = CUT_SAFE_CALL( cutGetTimerValue(timer));</span></p>
<p style="text-align:justify;padding-left:30px;"><span style="font-family:courier;">printf(<span style="color:#008000;">&#8220;A execução durou %5.3f milissegundos\n&#8221;</span>, tempo);</span></p>
<p style="text-align:justify;padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL(cutDeleteTimer(timer));</span></p>
<p style="text-align:justify;"><span style="font-family:courier;">}</span></p>
<p><span style="font-family:courier;"> </span></p>
<p style="text-align:justify;">
<p style="text-align:justify;">
<p style="text-align:justify;">Parte ou todo esse roteiro não funcionou pra você? Deixe comentário!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gpubrasil.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gpubrasil.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gpubrasil.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gpubrasil.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gpubrasil.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gpubrasil.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gpubrasil.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gpubrasil.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gpubrasil.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gpubrasil.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gpubrasil.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gpubrasil.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gpubrasil.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gpubrasil.wordpress.com/67/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gpubrasil.com&amp;blog=9721039&amp;post=67&amp;subd=gpubrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gpubrasil.com/2009/10/02/medicao-de-tempo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b0ea1e9e7746ea823e164457c495d20c?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">Labaki</media:title>
		</media:content>
	</item>
		<item>
		<title>Cuidados na medição de tempo</title>
		<link>http://gpubrasil.com/2009/10/02/cuidados-na-medicao-de-tempo/</link>
		<comments>http://gpubrasil.com/2009/10/02/cuidados-na-medicao-de-tempo/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 20:09:22 +0000</pubDate>
		<dc:creator>Labaki</dc:creator>
				<category><![CDATA[cookbook]]></category>
		<category><![CDATA[dica]]></category>

		<guid isPermaLink="false">http://gpubrasil.wordpress.com/?p=48</guid>
		<description><![CDATA[Adaptado da mensagem enviada por Daniel Medina à lista GPUBrasil. Pessoal, já faz algum tempo que estou para reviver este tópico e sempre esqueço. Quero compartilhar com vocês um detalhe que me consumiu alguns dias quebrando a cabeça em cima disso. Ao implementar em meu programa o algoritmo sugerido pelo Labaki para realizar a análise [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gpubrasil.com&amp;blog=9721039&amp;post=48&amp;subd=gpubrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">
<p style="text-align:justify;">Adaptado da mensagem enviada por <strong>Daniel Medina</strong> à lista <a href="http://groups.google.com.br/group/gpubrasil" target="NEW"> GPUBrasil</a>.</p>
<p style="text-align:justify;">
<p style="text-align:justify;">Pessoal, já faz algum tempo que estou para reviver este tópico e sempre esqueço. Quero compartilhar com vocês um detalhe que me consumiu alguns dias quebrando a cabeça em cima disso.</p>
<p style="text-align:justify;">Ao implementar em meu programa o algoritmo sugerido pelo Labaki para realizar a análise do tempo de execução, notei que o desempenho da GPU estava muito ruim comparado ao da CPU (com volume pequeno de dados estava até maior). Após procurar muito a causa, descobri que o vilão da história é a API do CUDA. Esta camada de software não é inicializada durante a inicialização do programa principal. Ela só é instanciada no momento da primeira chamada a alguma função da API (no meu caso ocorria quando eu chamava a função cuda_malloc pela primeira vez).<br />
<span style="font-family:courier;"><br />
<span style="color:#ff0000;"># include &lt;stdlib.h&gt;</span></span></p>
<p><span style="color:#ff0000;"><span style="font-family:courier;"># include &lt;stdio.h&gt;</span></span></p>
<p><span style="color:#ff0000;"><span style="font-family:courier;"># include &lt;cutil.h&gt;</span></span></p>
<p><span style="font-family:courier;">int main()</span></p>
<p><span style="font-family:courier;">{</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">float tempo;</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">unsigned int timer = 0;</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL( cutCreateTimer( &amp;timer));</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL( cutStartTimer( timer));</span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// Primeiro comando para a GPU (cudaMalloc, por exemplo).</span></span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// &#8230;</span></span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// Região de execução: aqui vai o trecho de código cujo</span></span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// tempo de execução queremos medir.</span></span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">tempo = CUT_SAFE_CALL( cutGetTimerValue(timer));</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">printf(<span style="color:#008000;">&#8220;A execução durou %5.3f milissegundos\n&#8221;</span>, tempo);</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL(cutDeleteTimer(timer));</span></p>
<p style="text-align:justify;"><span style="font-family:courier;">}<br />
</span><br />
Ao receber a primeira instrução, a API se inicializa e isto leva um tempo considerável. Empiricamente levantei que esse tempo é de aproximadamente 40ms em uma GTX  280 e 70ms em uma GT 8800.</p>
<p style="text-align:justify;">Para aplicações que duram dias ou semanas, este tempo não chega a ser um problema, mas para aplicações como a minha, cujo tempo de execução é da ordem de milissegundos, este <em>delay</em> é algo altamente indesejável.</p>
<p style="text-align:justify;">Como solução, eu coloquei uma instrução &#8220;dummy&#8221; (malloc de 0 bytes) no início do algoritmo só para inicializar a placa, e desconsiderei este tempo do cálculo utilizado para comparação entre CPU e GPU. Por ser um custo de tempo intrínseco e que acontece somente uma vez em toda a execução do software, ele pode ser desconsiderado do benchmark. Veja um exemplo.</p>
<p style="text-align:justify;"><span style="font-family:courier;"><br />
<span style="color:#ff0000;"># include &lt;stdlib.h&gt;</span></span></p>
<p><span style="color:#ff0000;"><span style="font-family:courier;"># include &lt;stdio.h&gt;</span></span></p>
<p><span style="color:#ff0000;"><span style="font-family:courier;"># include &lt;cutil.h&gt;</span></span></p>
<p><span style="font-family:courier;">int main()</span></p>
<p><span style="font-family:courier;">{</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">float tempo;</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">unsigned int timer = 0;</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL( cutCreateTimer( &amp;timer));</span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// Um comando dummy, sem efeito no programa, só para</span></span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// inicializar a placa. Esse passa a ser então o primeiro</span></span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// comando de GPU do programa.</span></span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">float* dummy;</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">CUDA_SAFE_CALL( cudaMalloc((void**) &amp;dummy, sizeof(float)));</span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// Só então o cronômetro é ligado:</span></span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL( cutStartTimer( timer));</span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// Região de execução: aqui vai o trecho de código cujo</span></span></p>
<p style="padding-left:30px;"><span style="color:#008000;"><span style="font-family:courier;">// tempo de execução queremos medir.</span></span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">tempo = CUT_SAFE_CALL( cutGetTimerValue(timer));</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">printf(<span style="color:#008000;">&#8220;A execução durou %5.3f milissegundos\n&#8221;</span>, tempo);</span></p>
<p style="padding-left:30px;"><span style="font-family:courier;">CUT_SAFE_CALL(cutDeleteTimer(timer));</span></p>
<p><span style="font-family:courier;">}<br />
</span><br />
Parte ou todo esse roteiro não funcionou pra você? Deixe comentário!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/gpubrasil.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/gpubrasil.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/gpubrasil.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/gpubrasil.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/gpubrasil.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/gpubrasil.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/gpubrasil.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/gpubrasil.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/gpubrasil.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/gpubrasil.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/gpubrasil.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/gpubrasil.wordpress.com/48/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/gpubrasil.wordpress.com/48/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/gpubrasil.wordpress.com/48/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=gpubrasil.com&amp;blog=9721039&amp;post=48&amp;subd=gpubrasil&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://gpubrasil.com/2009/10/02/cuidados-na-medicao-de-tempo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b0ea1e9e7746ea823e164457c495d20c?s=96&#38;d=monsterid&#38;r=G" medium="image">
			<media:title type="html">Labaki</media:title>
		</media:content>
	</item>
	</channel>
</rss>