<?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/"
	>

<channel>
	<title>Del&#039;Arco &#187; instalação</title>
	<atom:link href="http://blog.delarco.com.br/tag/instalacao/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.delarco.com.br</link>
	<description>The Pixel Company</description>
	<lastBuildDate>Mon, 07 Jun 2010 18:35:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Programação Multicore com OpenMP</title>
		<link>http://blog.delarco.com.br/programacao-multicore-com-openmp/</link>
		<comments>http://blog.delarco.com.br/programacao-multicore-com-openmp/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 02:21:37 +0000</pubDate>
		<dc:creator>Leandro Del&#39;Arco</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[OpenMP]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[codeblocks]]></category>
		<category><![CDATA[instalação]]></category>
		<category><![CDATA[multicore]]></category>
		<category><![CDATA[múltiplos núcleos]]></category>
		<category><![CDATA[openmp]]></category>

		<guid isPermaLink="false">http://blog.delarco.com.br/?p=111</guid>
		<description><![CDATA[
Hoje em dia é normal ouvir do vendedor &#8220;Esse computador é ótimo! Tem 4 GB de RAM e é um Core Duo!&#8220;. Apesar de, na maioria das vezes, a pessoa nem fazer idéia do que diabos é um Core Duo. Mas tudo bem, esse é o papel do vendedor, certo? É claro que qualquer entendido [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img class="aligncenter size-full wp-image-113" src="http://blog.delarco.com.br/wp-content/uploads/2009/10/mc_processor.jpg" alt="multicore_processor" width="312" height="233" /></p>
<p>Hoje em dia é normal ouvir do vendedor &#8220;<em>Esse computador é ótimo! Tem 4 GB de RAM e é um Core Duo!</em>&#8220;. Apesar de, na maioria das vezes, a pessoa nem fazer idéia do que diabos é um Core Duo. Mas tudo bem, esse é o papel do vendedor, certo? É claro que qualquer entendido sabe que isso não qualifica o produto como &#8220;<em>bom</em>&#8220;, longe disso, temos que levar em conta muitos outros detalhes que pessoas que não são da área não entendem.</p>
<p>Com a chegada dos processadores de múltiplos núcleos, o marketing direcionou-se à  esse fator e esqueceu de que memória cache e barramento contam MUITO no desempenho. A maioria das pessoas não entendem, por exemplo, que um processador de 2 núcleos de 2.0 GHz NÃO significa 4.0 GHz ou que um sistema operacional de 32 bits não aproveita as vantagens do hardware de 64 bits.</p>
<p>O que me deixa triste é ouvir esse tipo de  <span style="text-decoration: line-through;">enganação</span> picaretagem de amigos/conhecidos da faculdade ( <a href="http://www.fatecriopreto.edu.br/php/index.php?option=com_content&amp;view=category&amp;id=34:info&amp;Itemid=34&amp;layout=default" target="_blank">Tecnologia em Informática com Ênfase em Gestão de Negócios &#8211; FATEC Rio Preto</a>). By the way, não quero desmerecer a faculdade, pois devo muito à vários professores que tiveram a paciência de aguentar alunos como eu e o <a href="http://terramel.org" target="_blank">bomba</a>.</p>
<p>Antes de entrar no assunto principal, entenda que não adianta ter um processador com 487564764 núcleos se o software não sabe como utilizá-los, okay?</p>
<p>Como recentemente adquiri um Phenom X3 (é, 3 núcleos) resolvi descobrir como aproveitar todo esse poder. Com uma busca aqui e uma ali (no <a href="http://google.com" target="_blank">oráculo</a>), trago o que aprendi.</p>
<h2>OpenMP?</h2>
<p>O <a href="http://openmp.org/" target="_blank">OpenMP</a> (Open Multi-Processing) é uma API aberta para programação paralela. De acordo com o site oficial:</p>
<blockquote><p>A API OpenMP auxilia na programação multiplataforma, paralela e com memória compartilhada em C/C++ e Fortran em todas as arquiteturas, incluindo plataformas Unix e Windows NT. Constituída por um grupo de grandes empresas de hardware e software, o OpenMP é um modelo portável e escalável que oferece ao programador uma interface flexível para o desenvolvimento de aplicações paralelas visando desktop até supercomputadores.</p></blockquote>
<p>A tradução no olhômetro ficou um lixo, mas dá pra ter uma idéia do que se trata.</p>
<blockquote><p>Beleza, nunca ouvi falar. Vale a pena alocar recursos (tempo) para aprender?</p></blockquote>
<p>Saiba que essa API (pelo menos a especificação) existe desde 1997, sendo os membros permanentes do Architecture Review Board (ARB):</p>
<ul>
<li> AMD (David Leibs)</li>
<li> Cray (James Beyer)</li>
<li> Fujitsu (Matthijs van Waveren)</li>
<li> HP (Uriel Schafer)</li>
<li> IBM (Kelvin Li)</li>
<li> Intel (Sanjiv Shah)</li>
<li> NEC (Kazuhiro Kusano)</li>
<li> The Portland Group, Inc. (Michael Wolfe)</li>
<li> SGI (Lori Gilbert)</li>
<li> Sun Microsystems (Nawal Copty)</li>
<li> Microsoft (-)</li>
</ul>
<p>(<em><a href="http://openmp.org/wp/about-openmp/" target="_blank">Retirado do site oficial</a></em>)</p>
<p><strong>Convencido(a)?</strong></p>
<h2>Instalando o OpenMP</h2>
<p>É simples, você não instala.</p>
<blockquote><p>Como assim?</p></blockquote>
<p>Você DEVE ter um compilador que tenha o OpenMP implementado.</p>
<blockquote><p>E o meu compilador implementa?</p></blockquote>
<p><a href="http://openmp.org/wp/openmp-compilers/" target="_blank">Aqui </a>vc pode ver a lista de compiladores que disponibilizam o recurso. Como, provavelmente, vc usa:</p>
<ul>
<li><strong>V</strong><strong>isual C++ 2008</strong>: apenas a versão Professional (ou sei lá o nome da versão que não seja a Express) possui os headers necessários. ACHO que se vc copiar os headers da versão paga para a Express, irá funcionar;</li>
<li><strong>Code::Blocks (MinGW)</strong>: apenas nas versões (do gcc) 4.3.2 ou superiores.</li>
</ul>
<p>Baixei o <a href="http://www.mingw.org/" target="_blank">MinGW</a> mais recente no site oficial e instalei para usar com o Code::Blocks. Porém, a versão do gcc era a <em>3.4.alguma-coisa</em> e é claro, não funcionou pois não possuia os headers necessários.</p>
<p>Então, resolvi instalar logo o <a href="http://www.tdragon.net/recentgcc/" target="_blank">TDM&#8217;s GCC/MinGW</a> que é uma build não oficial dos binários mais recentes do GCC. Faça o download do <a href="http://sourceforge.net/projects/tdm-gcc/files/TDM-MinGW%20Installer/1.908.0/tdm-mingw-1.908.0-4.4.1-2.exe/download" target="_blank">instalador mais recente</a> e, na hora da instalação, escolha o diretório MinGW que está dentro do diretório de instalação do seu Code::Blocks (no meu caso, E:\CodeBlocks\MinGW):</p>
<p><img class="aligncenter size-full wp-image-121" src="http://blog.delarco.com.br/wp-content/uploads/2009/10/tdm_install1.jpg" alt="tdm_install1" width="513" height="399" /></p>
<p>Clique em &#8220;Next &gt;&#8221; e selecione um mirror:</p>
<p><img class="aligncenter size-full wp-image-122" src="http://blog.delarco.com.br/wp-content/uploads/2009/10/tdm_install2.jpg" alt="tdm_install2" width="513" height="399" /></p>
<p>Clique em &#8220;Next &gt;&#8221; e selecione apenas os componentes que deseja instalar. No meu caso, deixei como está (todos):</p>
<p><img class="aligncenter size-full wp-image-123" src="http://blog.delarco.com.br/wp-content/uploads/2009/10/tdm_install3.jpg" alt="tdm_install3" width="513" height="399" /></p>
<p>Após selecionar os componentes, clique em &#8220;Install&#8221; e espere a extração dos arquivos terminar.</p>
<h2>Hello World!</h2>
<p>Se tudo estiver certo, então será possível compilar o &#8220;Hello World&#8221; abaixo:</p>
<pre class="brush: cpp;">

#include &lt;omp.h&gt;
#include &lt;stdio.h&gt;

int main()
{
#pragma omp parallel
printf(&quot;Hello! (from thread %d, num. threads %d)\n&quot;,
omp_get_thread_num(),
omp_get_num_threads());
}
</pre>
<p>Antes de tentar rodar o exemplo, precisamos definir a compile-time flag <strong>-fopenmp</strong> para que o compilador saiba que o projeto utiliza o OpenMP. Se vc compilar pelo prompt de comando diretamente com o GCC, basta adicionar o parâmetro <strong>-fopenmp</strong>, ficando assim:</p>
<p><span style="color: #000000"><strong><em>gcc.exe hello_world.c -o hello_world.exe -fopenmp</em></strong></span></p>
<p>Já no Code::Blocks, vc também precisa linkar a <strong>libgomp.dll.a </strong>e ter o arquivo <strong>libgomp-1.dll</strong> na pasta BIN do seu compilador ou na pasta do seu projeto. Então, faça assim:</p>
<ul>
<li>Selecione a opção &#8220;Build options&#8230;&#8221; no menu &#8220;Project&#8221; do Code::Blocks;</li>
<li>Na lista da esquerda, selecione o seu projeto (o 1º item, não o Debug, nem o Release);</li>
<li>Procure a aba &#8220;Other options&#8221; dentro da aba &#8220;Compiler settings&#8221;. Adicione a flag <strong>-fopenmp</strong>;<br />
<img class="aligncenter size-full wp-image-125" src="http://blog.delarco.com.br/wp-content/uploads/2009/10/omp_hw1.jpg" alt="omp_hw1" width="680" height="525" /></li>
<li>Agora selecione a aba &#8220;Linker settings&#8221; e adicione o arquivo <strong>libgomp.dll.a</strong>. Na minha instalação, esse arquivo estava no diretório &#8220;<em>E:\CodeBlocks\MinGW\lib\gcc\mingw32\4.4.1\</em>&#8220;;<strong> </strong></li>
<li>É importante que vc linke o arquivo <strong>libgomp.dll.a</strong> e não o <strong>libgomp.a;</strong></li>
<li>O projeto já pode ser compilado, mas para que funcione, será necessário copiar o arquivo <strong>libgomp-1.dll</strong> para o diretório do seu executável. Assim como a lib, o diretório em que esse arquivo pode ser encontrado não é tão trivial. Na minha instalação, encontrei em &#8220;<em>E:\CodeBlocks\MinGW\lib\gcc\mingw32\bin</em>&#8220;;</li>
<li>Creio que não é necessário explicar a parte de copiar o arquivo (<em>CTRL + C, CTRL + V, a mesma coisa que vc usa para fazer os trabalhos da faculdade</em>).</li>
</ul>
<p>Btw, <a href="http://gcc.gnu.org/projects/gomp/" target="_blank">GOMP</a> é o projeto que implementou o OpenMP nos compiladores C, C++ e Fortran do GNU Compiler Collection.</p>
<p>Pronto, o Hello World deve (ou deveria) mostrar algumas mensagens &#8220;Hello!&#8221; com o ID da thread em que está sendo executado, seguido do número de threads. Aqui tive o seguinte resultado:</p>
<p><img class="aligncenter size-full wp-image-126" src="http://blog.delarco.com.br/wp-content/uploads/2009/10/omp_hw2.jpg" alt="omp_hw2" width="677" height="342" /></p>
<p>Mas por que 3 threads? Porque esse é o número padrão para a variável ambiente OMP_NUM_THREADS (na minha implementação, pelo menos). Para definir o número de threads, chame a função <strong>omp_set_num_threads(num_threads).</strong> Então, o &#8220;Hello World&#8221; modificado ficaria assim:</p>
<pre class="brush: cpp;">

#include &lt;omp.h&gt;
 #include &lt;stdio.h&gt;

 int main()
 {
 omp_set_num_threads(10);

 #pragma omp parallel
 printf(&quot;Hello! (from thread %d, num. threads %d)\n&quot;,
 omp_get_thread_num(),
 omp_get_num_threads());
 }
</pre>
<p>Agora vc verá 10 mensagens &#8220;Hello!&#8221;.</p>
<h2>É só isso?</h2>
<p>Não. Apesar de simples, o exemplo anterior usa eficientemente todos os núcleos disponíveis, de forma transparente. Pode parecer que não houve um grande ganho no desempenho, mas com alguns testes vamos ver que a programação multicore pode otimizar de forma significativa o aplicativo.</p>
<p>Para que o post não fique cansativo, deixo o resto para semana que vem.</p>
<p><strong>Fonte:</strong> <a href="http://openmp.org/wp/" target="_blank">OpenMP.org</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.delarco.com.br/programacao-multicore-com-openmp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->
