<?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>Using Open MP</title>
	<atom:link href="http://usingomp.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://usingomp.wordpress.com</link>
	<description>Aprendendo a usar o OpenMP do zero</description>
	<lastBuildDate>Mon, 23 May 2011 19:49:43 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='usingomp.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Using Open MP</title>
		<link>http://usingomp.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://usingomp.wordpress.com/osd.xml" title="Using Open MP" />
	<atom:link rel='hub' href='http://usingomp.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Mudamos!!!</title>
		<link>http://usingomp.wordpress.com/2011/05/23/mudamos/</link>
		<comments>http://usingomp.wordpress.com/2011/05/23/mudamos/#comments</comments>
		<pubDate>Mon, 23 May 2011 19:49:42 +0000</pubDate>
		<dc:creator>alvesjnr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://usingomp.wordpress.com/?p=35</guid>
		<description><![CDATA[Atualmente estamos no endereço: www.assemblando.wordpress.com<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=usingomp.wordpress.com&amp;blog=12869560&amp;post=35&amp;subd=usingomp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h1>Atualmente estamos no endereço:<a href="http://assemblando.wordpress.com"> www.assemblando.wordpress.com</a></h1>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/usingomp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/usingomp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/usingomp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/usingomp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/usingomp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/usingomp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/usingomp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/usingomp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/usingomp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/usingomp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/usingomp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/usingomp.wordpress.com/35/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/usingomp.wordpress.com/35/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/usingomp.wordpress.com/35/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=usingomp.wordpress.com&amp;blog=12869560&amp;post=35&amp;subd=usingomp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://usingomp.wordpress.com/2011/05/23/mudamos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba1c522466fec0845bee447874c91c37?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alvesjnr</media:title>
		</media:content>
	</item>
		<item>
		<title>OpenMP &#8211; Primeiro contato</title>
		<link>http://usingomp.wordpress.com/2010/04/08/openmp-primeiro-contato/</link>
		<comments>http://usingomp.wordpress.com/2010/04/08/openmp-primeiro-contato/#comments</comments>
		<pubDate>Thu, 08 Apr 2010 04:16:54 +0000</pubDate>
		<dc:creator>alvesjnr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://usingomp.wordpress.com/?p=16</guid>
		<description><![CDATA[Nada como um projeto novo para entusiasmar no aprendizado de tecnologias diferentes. Já fazia algum tempo que eu estava com vontade de começar a trabalhar com programação paralela, mas sem algo concreto para dar o impulso inicial estava complicado. Relembrando o algorítimo de cálculo do valor de pi com base em uma série de somas: [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=usingomp.wordpress.com&amp;blog=12869560&amp;post=16&amp;subd=usingomp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Nada como um projeto novo para entusiasmar no aprendizado de tecnologias diferentes. Já fazia algum tempo que eu estava com vontade de começar a trabalhar com programação paralela, mas sem algo concreto para dar o impulso inicial estava complicado.</p>
<p>Relembrando o algorítimo de cálculo do valor de pi com base em uma série de somas:</p>
<pre><strong><strong>soma = 0
para cada i, enquanto i &lt; LIMITE:
   soma += 4/(i*4 + 1)
   soma -= 4/(i*4 + 3)
   i += 1
fim para

</strong></strong></pre>
<p>Resolvi implementar esse pequeno código para testar uma primeira implementação usando o OpenMP. Na minha pesquisa de paralelismo de simulação de dinâmica dos Fluidos (CFD) vou usar a linguagem <a href="http://en.wikipedia.org/wiki/Fortran" target="_blank">Fortran</a>, por ser uma linguagem diretamente voltado à cálculos matemáticos. Porém, com uma rápida pesquisa sobre OpenMP, descobri que ela é suportada também pela linguagem <a href="http://en.wikipedia.org/wiki/C%2B%2B" target="_blank">C++</a>, uma velha amiga, que eu sempre gostei muito de usar. Pensei então &#8220;por que não estudar como usar o OpenMP em ambas?&#8221;. Então, na medida do possível, pretendo repetir todos os experimentos e exemplos nas duas linguagens.</p>
<div id="attachment_17" class="wp-caption alignnone" style="width: 729px"><a href="http://usingomp.files.wordpress.com/2010/04/openmptimeline.gif"><img class="size-full wp-image-17" title="openMPtimeline" src="http://usingomp.files.wordpress.com/2010/04/openmptimeline.gif?w=719&#038;h=143" alt="" width="719" height="143" /></a><p class="wp-caption-text">Versões do OpenMP para C++ e Fortran</p></div>
<p>Como discutido no <em>post</em> anterior, a idéia do OpenMP é ser uma API que faz o gerenciamento dos <em>Threads</em>, distribuindo-os entre os núcleos/processadores disponíveis no sistema. Esse gerenciamento faz com que o programador não precise se preocupar com o sincronismo entre os <em>threads</em>, nem com a escalabilidade dos sistema.</p>
<p>Porém, o OpenMP é uma API, ou seja, uma ferramenta. E uma ferramenta só faz o que o programador a instrui fazer. Basicamente fica ao encargo do programador definir quais regiões serão paralelizadas, quais serão executadas de forma serial e quais são as variáveis compartilhadas e privadas de cada <em>thread</em>. O programador faz uso de algumas diretivas que são incluídas no código. Essas diretivas são avaliadas pelo pré-processador do OpenMP, e este faz o trabalho de dividir as tarefas entre os núcleos/processadores.</p>
<p>Tomemos como base a implementação em linguagem C do programa de cálculo do PI:</p>
<p><pre class="brush: cpp;">
#include
#define NUM_PASSOS 20000000

int main(){
 double pi = 0;
 int i;

 for(i = 0; i &lt; NUM_PASSOS; i++){
   pi += 4.0 / (4.0*i + 1.0);
   pi -= 4.0 / (4.0*i + 3.0);
 }
 printf(&quot;-&gt; %f\n&quot;,pi);
return 0;
}
</pre></p>
<p><strong> </strong></p>
<p><strong> </strong></p>
<p>O mesmo exemplo pode ser visto em Fortran <a href="http://pastebin.com/sANACdEV" target="_blank">aqui</a></p>
<p>Compilando esse código com o <a href="http://gcc.gnu.org/" target="_blank">GCC</a>, sem nenhuma <em>flag</em> de otimização e executando o código em um pc com processador intel ia32 com GNU/Linux o programa precisou de quase 1 segundo para executar:</p>
<p><pre class="brush: plain;">

[john@vaio rascunhos]$ time ./a.out
-&gt; 3.141593

real    0m0.906s
user    0m0.870s
sys     0m0.000s

</pre></p>
<p>Apenas para efeito de comparação, o código escrito em Fortran, compilado com o compilador ifort da intel, precisou de apenas 0.010s para executar. Um ganho de quase 90% que o Fortran proporciona, mas isso é assunto para um outro <em>post.</em></p>
<p>O motivo pelo o qual esse código consumiu tanto tempo para ser executado está no número de repetições dentro do laço. A priori, em todo laço existe uma grande possibilidade de paralelizar o processo, dividindo as tarefas internas do laço entre os vário núcleos do meu sistema multiprocessado. Neste exemplo simples, percebam, a complexidade do meu algoritmo é linear, e relativa ao número de iterações. Em caso de complexidades mais críticas (quadrática, por exemplo), a paralelização do código traz benefícios ainda mais evidentes.</p>
<p>Devido a problemas estruturais (minha máquina não é multi-core) realizei o mesmo experimento com o auxílio do meu amigo <a href="http://www.coding.com.br/" target="_blank">Maluta</a> em um Mac Mini que rendeu o seguinte resultado (não paralelizado, apenas para servir de base comparativa para o código paralelizado):</p>
<p><pre class="brush: plain;">
$ time ./a
-&gt; 3.141593

real 0m0.686s
user 0m0.634s
sys 0m0.002s
</pre></p>
<p>Para paralelizar o código devemos indicar, por meio de diretivas, quais trechos o compilador deve utilizar a API OpenMP para dividir em <em>threads</em>. A primeira diretiva apresentada é a diretiva <strong>OMP PARALLEL</strong>. Essa diretiva indica qual parte do código vai ser dividida (<em>fork</em>). O final de um trecho paralelo é sinalizado com um <strong>OMP END PARALLEL:</strong></p>
<pre><strong>...
... trecho serial
...
OMP PARALLEL
...
... trecho paralelizado
...
OMP END PARALLEL
...
... serial novamente

</strong></pre>
<p>Desta maneira, tudo que está no trecho paralelizado vai ser executado simultaneamente por todos os <em>threads</em> do sistema. Devemos salientar que as diretivas sofrem leves variações do C++ para o Fortran. Essas diferenças serão notadas nos códigos, mas a semântica é a mesma para ambos os casos.</p>
<p>Outra diretiva, senão a mais usada, é a que indica que um <em>loop</em> deve ser paralelizado. A diretiva <strong>OMP PARALLEL FOR</strong> ou <strong>OMP DO </strong>são usadas para indicar que um laço deve ser dividido. Como o intuito desse <em>blog</em> não é ser um tutorial de OpenMP ou uma referência formal, mais detalhes sobre a sintaxe de cada diretiva pode ser encontrada no <em>site</em> oficial do projeteo <a href="http://openmp.org/wp/" target="_blank">OpenMP</a>.</p>
<p>Paralelizando o laço principal (e único) do meu programa, temos o seguinte código:</p>
<p><pre class="brush: cpp;">
#include
#include
#define NUM_PASSOS 20000000
&lt;pre&gt;int main(){
	double pi = 0;
	int i;
	#pragma omp parallel for
	for(i = 0; i &lt; NUM_PASSOS; i++){
		pi += 4.0 / (4.0*i + 1.0);
		pi -= 4.0 / (4.0*i + 3.0);
	}
	printf(&quot;-&gt; %f\n&quot;,pi);
return 0;
}
</pre></p>
<p>O equivalente em Fortran pode ser encontrado <a href="http://pastebin.com/MtfPneTS" target="_blank">aqui.</a></p>
<p>Para compilar o código usando o GCC e o OpenMP, é necessário usar a flg -fopenmp:</p>
<pre>gcc -fopenmp &lt;source&gt; [-o nome]</pre>
<p>O resultado da execução deste código foi:</p>
<p><pre class="brush: plain;">
$ time ./b
-&gt; 2.897633

real 0m0.544s
user 0m1.041s
sys 0m0.005s
</pre></p>
<p>Bem, o tempo de execução para o código linear foi de o.686s e no paralelo foi de 0.544s, ou seja, um ganho de aproximadamente 20%, porém, o meu resultado foi <strong>PI = 2.897633 ?????????????</strong> Alguma coisa não funcionou corretamente neste modelo de paralelismo.</p>
<p>A resposta é simples: quando o código foi paralelizada, cada parte da execução foi feita em um núcleo diferente. Assim, ao se fazer o <em>join</em>, as duas partes não são somadas, como deveriam. Em outras palavras, as variáveis Soma nesse caso estão separadas, e não compartilham o mesmo dado. O que devemos fazer nesse caso é forçar a união desses valores ao fim da execução dos <em>threads</em>. Para isso usamos mais uma diretiva, a diretiva <strong>REDUCTION<em>:</em></strong></p>
<p><pre class="brush: cpp;">
#include
#include
#define NUM_PASSOS 20000000

int main(){
    double pi = 0;
    int i;
    #pragma omp parallel for reduction (+:pi)
    for(i = 0; i &lt; NUM_PASSOS; i++){
        pi += 4.0 / (4.0*i + 1.0);
        pi -= 4.0 / (4.0*i + 3.0);
    }
    printf(&quot;-&gt; %f\n&quot;,pi);
    return 0;
}
</pre></p>
<p>Novamente, o resultado em Fortran se encontra <a href="http://pastebin.com/8a6RLr09" target="_blank">aqui.</a></p>
<p>Compilando e executando o código, temos a seguinte saída:</p>
<p><pre class="brush: plain;">
$ time ./a
-&gt; 3.141593

real 0m0.433s
user 0m0.634s
sys 0m0.003s
</pre></p>
<p>Agora o nosso resultado confere com o valor de PI e o ganho em desempenho é de aproximadamente 36% comparado com o seu equivalente serial.</p>
<p>Com isso já temos base suficiente para brincar um tanto bom com paralelismo, e testar em outros algoritimos. Vale novamente ressaltar que esse <em>blog</em> não tem o intuito de ser um tutorial de OpenMP, estou apenas mostrandop por onde caminhei, e indicando onde encontrei as referências para estudo.</p>
<pre><strong> </strong></pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/usingomp.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/usingomp.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/usingomp.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/usingomp.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/usingomp.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/usingomp.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/usingomp.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/usingomp.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/usingomp.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/usingomp.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/usingomp.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/usingomp.wordpress.com/16/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/usingomp.wordpress.com/16/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/usingomp.wordpress.com/16/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=usingomp.wordpress.com&amp;blog=12869560&amp;post=16&amp;subd=usingomp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://usingomp.wordpress.com/2010/04/08/openmp-primeiro-contato/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba1c522466fec0845bee447874c91c37?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alvesjnr</media:title>
		</media:content>

		<media:content url="http://usingomp.files.wordpress.com/2010/04/openmptimeline.gif" medium="image">
			<media:title type="html">openMPtimeline</media:title>
		</media:content>
	</item>
		<item>
		<title>O que é e como funciona o Paralelismo</title>
		<link>http://usingomp.wordpress.com/2010/03/31/entendendo-o-que-e-e-como-funciona-o-paralelismo/</link>
		<comments>http://usingomp.wordpress.com/2010/03/31/entendendo-o-que-e-e-como-funciona-o-paralelismo/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 18:19:56 +0000</pubDate>
		<dc:creator>alvesjnr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://usingomp.wordpress.com/?p=8</guid>
		<description><![CDATA[Sem delongas, na computação de alto desempenho o tempo é um fator determinante no resultado final de um trabalho. Em um campo onde a complexidade dos algoritmos tende a subir, e o tempo gasto para se executar um algoritmo engrandece junto à sua complexidade, distribuir as tarefas entre vários processadores e vários núcleos é uma [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=usingomp.wordpress.com&amp;blog=12869560&amp;post=8&amp;subd=usingomp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Sem delongas, na computação de alto desempenho o tempo é um fator determinante no resultado final de um trabalho. Em um campo onde a complexidade dos algoritmos tende a subir, e o tempo gasto para se executar um algoritmo engrandece junto à sua complexidade, distribuir as tarefas entre vários processadores e vários núcleos é uma maneira de se ganhar um tempo precioso na execução das tarefas.</p>
<p>O princípio básico é extremamente intuitivo: O seu código é dividido em partes que podem ser executadas separadamente, e cada uma dessas partes são enviadas à diferentes núcleos/processadores do seu sistema. Simples assim.</p>
<p style="text-align:left;">Como todo computólogo já está cansado de saber, a teoria pode até ser simples, mas na prática as coisas são um pouco diferente. Como o intuito desse <em>blog</em> é ser direto, vamos explicar por exemplos. Tomamos o código abaixo que tem como função calcular o valor de Π (pi). Esse cálculo pode ser feito baseado em uma série dada por :</p>
<p style="text-align:left;"><a href="http://usingomp.files.wordpress.com/2010/03/pi.png"><img class="size-full wp-image-9 aligncenter" title="pi" src="http://usingomp.files.wordpress.com/2010/03/pi.png?w=339&#038;h=50" alt="" width="339" height="50" /></a></p>
<p>Assim sendo, o algoritmo que resulta na soma pode ser descrito por:</p>
<pre><strong>soma = 0
para cada i, enquanto i &lt; LIMITE:
   soma += 4/(i*4 + 1)
   soma -= 4/(i*4 + 3)
   i += 1
fim para

</strong></pre>
<p>Ao final da sequência, a variável <em>soma</em> compreende o valor de pi.</p>
<p>Dentro desse <em>loop</em>, que deve ser repetido diversas vezes, são executadas duas principais funções, que geram a soma total do valor de pi. Imaginemos agora que fosse possível dividir essas duas somas, cada um para um núcleo de um processador:</p>
<pre><strong><strong>Processador 1:
soma1 = 0
para cada i, enquanto i &lt; LIMITE:
   soma1 += 4/(i*4 + 1)
   i += 1
fim para

</strong></strong>
<pre><strong><strong>Processador 2:
soma2 = 0
para cada i, enquanto i &lt; LIMITE:
   soma2 -= 4/(i*4 + 3)
   i += 1
fim para</strong></strong></pre>
</pre>
<p>E ao final de ambos os processamentos, os valores das duas variáveis são adicionados, resultando em um único valor:</p>
<pre><strong>soma = soma1 + soma2</strong></pre>
<p>Com isso nosso algoritmo de soma foi dividido em dois, e cada um direcionado para um núcleo independente. Isso faz com que as duas somas de cada <em>loop</em> ocorram &#8220;simultâneamente&#8221;, ou seja, em paralelo. Com isso, o ganho hipotético em tempo de execução do nosso algoritmo paralelizado é de cerca de 2x.</p>
<p>Esse técnica de dividir e reagrupar (<em>fork &amp; join)</em> é a base de como o <em>OpenMP</em> trabalha para paralelizar os códigos.</p>
<p><a href="http://usingomp.files.wordpress.com/2010/03/fork_join.jpg"><img class="alignnone size-full wp-image-10" title="fork_join" src="http://usingomp.files.wordpress.com/2010/03/fork_join.jpg?w=697&#038;h=203" alt="" width="697" height="203" /></a></p>
<p>A filosofia de se utilizar <em>fork/join</em> consiste em um <em>thread</em> principal, que dispara as <em>threads</em> que vão trabalhar em paralelo. Ao final do trabalho dessas <em>threads</em> em paralelo, o fluxo é reunido (<em>join</em>) o processamento continua de forma serial. No nosso exemplo do cálculo do Pi, essa sequência poderia ser enxergada da forma:</p>
<p><strong>thread principal-&gt; dispara os dois <em>loops</em> em <em>threads</em> diferentes para o cálculo das somas[1,2]<br />
<em>fork</em>-&gt; cada <em>thread</em> calcula sua soma, simultaneamente<br />
<em>join-&gt; </em>os valores das somas são somados, resultando no valor final do meu cálculo</strong></p>
<p>Para este exemplo simples, não fica muito complicado para o programador escrever duas rotinas de soma dentro de <em>loops</em> e disparar a execução dos <em>threads</em>, aguardar o resultado das somas e uní-los. Porém, temos alguns pequenos problemas:</p>
<ul>
<li>O código não é maleável em relação a quantidade de núcleos/processadores a serem utilizados.</li>
<li>O programador deve se encarregar de resolver todos os problemas como concorrência, <em>deadlock</em>, <em>join</em>, etc.</li>
<li>Não há como saber quantos núcleos eu tenho disponível.</li>
<li>O código não fica transparente ao programador.</li>
<li>Com o aumento do código, a manutenção da paralelismo torna-se impraticável.</li>
</ul>
<p>Como visto, usar <em>threads</em> diretamente resolve o problema, mas está longe de ser uma solução prática e escalável para paralelismo de códigos.</p>
<p>Para resolver esse problema, são empregadas APIs para paralelizar o código. Essas APIs nada mais fazem do que resolver para o programador quais trechos serão divididos, em quantos <em>threads</em> serão divididos e encarregar de enviá-los para seus respectivos núcleos/processadores. A API <em>OpenMP</em> é uma das soluções para se trabalhar com paralelismo de código, e foi a minha escolha para uma primeira abordagem com o assunto.</p>
<p>No próximo tópico começarei a falar sobre o <em>OpenMP</em>, como instalar, qual versão usar e alguns exemplos de códigos.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/usingomp.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/usingomp.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/usingomp.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/usingomp.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/usingomp.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/usingomp.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/usingomp.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/usingomp.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/usingomp.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/usingomp.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/usingomp.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/usingomp.wordpress.com/8/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/usingomp.wordpress.com/8/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/usingomp.wordpress.com/8/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=usingomp.wordpress.com&amp;blog=12869560&amp;post=8&amp;subd=usingomp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://usingomp.wordpress.com/2010/03/31/entendendo-o-que-e-e-como-funciona-o-paralelismo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba1c522466fec0845bee447874c91c37?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alvesjnr</media:title>
		</media:content>

		<media:content url="http://usingomp.files.wordpress.com/2010/03/pi.png" medium="image">
			<media:title type="html">pi</media:title>
		</media:content>

		<media:content url="http://usingomp.files.wordpress.com/2010/03/fork_join.jpg" medium="image">
			<media:title type="html">fork_join</media:title>
		</media:content>
	</item>
		<item>
		<title>Usando o Open MP</title>
		<link>http://usingomp.wordpress.com/2010/03/29/usando-o-open-mp/</link>
		<comments>http://usingomp.wordpress.com/2010/03/29/usando-o-open-mp/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 20:13:10 +0000</pubDate>
		<dc:creator>alvesjnr</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://usingomp.wordpress.com/?p=4</guid>
		<description><![CDATA[Resolvi criar um blog para acompanhar a minha evolução no estudo da tecnologia OpenMP para paralelização de aplicações que requerem alta demanda de processamento. A referência a ser utilizada paara este trabalho, num primeiro instante, é a publicação Using OpenMP: Portable Shared Memory Parallel Programming Barbara Chapman Gabriel Jost Ruud van der Pas O leitor [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=usingomp.wordpress.com&amp;blog=12869560&amp;post=4&amp;subd=usingomp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Resolvi criar um blog para acompanhar a minha evolução no estudo da tecnologia OpenMP para paralelização de aplicações que requerem alta demanda de processamento.</p>
<p>A referência a ser utilizada paara este trabalho, num primeiro instante, é a publicação</p>
<p><strong><a title="Amazon" href="http://www.amazon.com/Using-OpenMP-Programming-Engineering-Computation/dp/0262533022" target="_blank">Using OpenMP:  Portable Shared Memory Parallel Programming </a></strong></p>
<p><strong>Barbara Chapman</strong></p>
<p><strong>Gabriel Jost</strong></p>
<p><strong>Ruud van der Pas</strong></p>
<p>O leitor desse blog não deve esperar muitos formalismos na forma com o qual o assunto vai ser abordado. Na verdade o intuito dessa pulicação é manter um registro do progresso no estudo do OpenMP e, claro, manter registro pra pesquisas rápidas futuras.</p>
<p>Sobre a frequência de atualização, pretendo atualizar o blog a cada passo significativo que for dado no meu estudo, respeitando o tempo hábil para conclusão das tarefas acadêmicas correlatas. Em suma, devo escrever aqui uma vêz por semana.</p>
<p>Então, vamos estudar!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/usingomp.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/usingomp.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/usingomp.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/usingomp.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/usingomp.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/usingomp.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/usingomp.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/usingomp.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/usingomp.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/usingomp.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/usingomp.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/usingomp.wordpress.com/4/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/usingomp.wordpress.com/4/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/usingomp.wordpress.com/4/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=usingomp.wordpress.com&amp;blog=12869560&amp;post=4&amp;subd=usingomp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://usingomp.wordpress.com/2010/03/29/usando-o-open-mp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/ba1c522466fec0845bee447874c91c37?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">alvesjnr</media:title>
		</media:content>
	</item>
	</channel>
</rss>
