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
Linha 34:
 
==== Construções Para Sincronização ====
 
Apesar do OpenMP tentar tratar o que pode de maneira transparente, em algumas situações são necessárias diretivas de sincronização para garantir consistência entre os estados dos diversos fluxos de execução.
 
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".
 
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.
 
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.
 
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.
 
Por fim, é importante citar a diretiva "flush" que identifica um ponto de sincronização, aonde a implementação deve garantir uma "visão" consistente da memória.
 
==== Funções da Biblioteca ====