Programação Paralela em Arquiteturas Multi-Core/Programação em OpenMP: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Tawhaki (discussão | contribs)
Tawhaki (discussão | contribs)
Linha 79:
As principais construções de sincronização são: barrier, critical, atomic, single, master, ordered.
 
"omp barrier" é uma barreira de memória, quando uma ''thread'' atinge uma barreira, ela só prossegue após todas as demais atingirem aquela mesma barreira. Esta é a construção mais básica de todas. Algumas construções openmp já incluem, implicitamente, uma barreira no final e se você não quiser essa barreira, tem que incluir uma cláusula "nowait". Por exemplo, considere o seguinte código:
 
<pre>
#pragma omp parallel
{
#pragma omp sections
{
#pragma omp section
{
a();
}
#pragma omp section
{
b();
}
} // Aqui há uma barreira implícita
printf("Hello!");
} // Aqui há uma barreira implícita
</pre>
 
Como se pode ver, há barreiras implícitas no fim das construções "omp parallel" e "omp section". Isso significa que caso, por exemplo, a thread que executa a primeira seção termine seu trabalho muito antes da thread que executa a segunda seção, ela irá parar e esperar a segunda seção terminar antes de imprimir "Hello!". Se incluirmos a cláusula "nowait":
 
<pre>
#pragma omp parallel
{
#pragma omp sections nowait
{
#pragma omp section
{
a();
}
#pragma omp section
{
b();
}
} // Não há mais barreira implícita aqui, devido a cláusula "nowait"
printf("Hello!");
} // Aqui há uma barreira implícita
</pre>
então assim que uma thread acabar de executar uma seção, ela pode sair do escopo de "omp sections" e imprimir "Hello", sem esperar que a outra seção esteja concluída.
 
As construções "critical" e "atomic" servem para dizer que o que estiver dentro deve ser executado somente por um ''thread'' ao mesmo tempo. A diferença entre as duas é que a "atomic" tenta utilizar recursos do hardware para ser mais eficiente. Se o código dentro de um atomic for complicado demais pro hardware, então ele é automaticamente convertido para um critical.