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 132:
</pre>
 
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. Exemplo:
 
<pre>
Além dessas, existe também a diretiva "single". Ela especifica que o bloco de código deve ser executado por apenas um dos threads. A diretiva "master" é parecida: nela é garantido que a thread que vai executar aquele bloco é a ''master thread''. Isso pode ser útil em alguns casos. Por exemplo, código pra atualizar interface gráfica em X11 normalmente só pode ser executado em uma thread específica, que é a principal. Se você quiser atualizar a tela, por qualquer motivo, de dentro de uma seção paralela, tem que garantir que essa atualização será feita pela master thread.
#pragma omp parallel for
for(int i = 0; i < 1048576; ++i)
{
int partial_result = f(x[i], y[i], z[i]);
#pragma omp atomic
{
sum += partial_result;
}
}
</pre>
 
Além dessas, existe também a diretiva "single". Ela especifica que o bloco de código deve ser executado por apenas um dos threads. A diretiva "master" é parecida: nela é garantido que a thread que vai executar aquele bloco é a ''master thread''. Isso pode ser útil em alguns casos. Por exemplo, código pra atualizar interface gráfica em X11 normalmente só pode ser executado em uma thread específica, que é a principal. Se você quiser atualizar a tela, por qualquer motivo, de dentro de uma seção paralela, tem que garantir que essa atualização será feita pela master thread. Por exemplo, em
<pre>
#pragma omp parallel
{
a();
b();
c();
#pragma omp barrier
#pragma omp master
{
send_results_to_screen();
}
d();
e();
f();
}
</pre>
a chamada à função send_results_to_screen() será feita apenas pela thread principal, mesmo ela estando dentro de uma seção paralela.
 
O OpenMP provê também a construção "ordered" que especifica que as iterações do ''loop'' devem ser executadas na mesma ordem que seriam caso o programa fosse executado de maneira serial.