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
formatação; cat
Linha 1:
=== ProgramaçãoIntrodução eme OpenMPhistória ===
 
=== Introdução e História ===
 
O OpenMP (Open Multi-Processing) é uma API multi-plataforma para processamento paralelo baseado em memória compartilhada para as linguagens C/C++ e Fortran. Ela consiste de um conjunto de diretivas para o compilador, funções de biblioteca e variáveis de ambiente que influenciam na execução do programa.
Linha 9 ⟶ 7:
Ele foi desenvolvido inicialmente sobre para Fortran em 1997 (pode ser considerado como algo relativamente novo). No ano seguinte, foi lançada a primeira versão para C/C++. Em 2000 foi lançada a versão 2.0 para Fortran e em 2002 foi lançada a versão para C/C++. A versão atual é a 2.5 e saiu em 2005. Nessa versão, finalmente foram combinados os padrões para Fortran e C/C++.
 
=== Modelo de Programaçãoprogramação ===
 
O OpenMP usa um modelo ''fork''/''join'' (que é como um mestre/escravo). Há um fluxo de execução principal (a master thread) e quando necessário (e.g.por exemplo, em uma seção paralela), novas threads são disparadas para dividir o trabalho. Por fim, ao fim de uma seção paralela, é feito um ''join''.
 
Uma recurso interessante do OpenMP é que a sincronização entre os threads quase sempre ocorre de maneira implícita, de maneira automática. Isso faz com que sua utilização seja algo muito simples. Inclusive, é possível fazer com que os programas compilem com ou sem OpenMP. Caso a biblioteca seja utilizada eles serão paralelos, caso contrário, seriais.
Linha 19 ⟶ 17:
O modelo OpenMP é fortemente baseado em memória compartilhada, mas existem implementações para outras arquiteturas (tipo message-passing). Essas implementações não costumam ser tão eficientes quanto a implementação tradicional.
 
=== Visão Geralgeral ===
 
==== Conceitos Básicosbásicos ====
 
==== Construções Parapara Divisãodivisão de Trabalhotrabalho ====
 
Uma das construções chave é o pragmaprograma "omp parallel", que declara uma seção paralela. Quando uma seção paralela é encontrada, ''threads'' são disparadas conforme necessário, e todas elas começam a executar o código dentro daquela seção paralela. As construções para divisão de trabalho citadas a seguir só funcionam dentro de uma seção paralela.
 
Na definição da seção paralela deve ser informado ao compilador várias coisas como quais variáveis serão privadas de cada thread e quais serão compartilhadas - isso é feita através das palavras "shared" e "private". Pode-se também determinar explicitamente quantos ''threads'' são desejados, através da palavra "num_threads".
Linha 33 ⟶ 31:
Outra construção de divisão de trabalho é o "omp sections". Ela define blocos independentes, que podem ser distribuídos entre as ''threads''. Cada ''section'' vai ser executada apenas por uma ''thread''. Trata-se de uma forma simples de paralelizar tarefas distintas que não tem (ou tem pouca) dependência de dados entre si. Um exemplo simples de uso seria a inicialização de dois arranjos com conteúdos distintos e que podem ser inicializado de maneira independente um do outro.
 
==== Construções Parapara Sincronizaçãosincronização ====
 
Apesar dode o 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.
Linha 49 ⟶ 47:
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 Bibliotecabiblioteca ====
 
Além das diretivas implícitas da OpenMP existe também uma biblioteca com funções que podem ser chamadas de dentro dos programas. Com estas funções é possível ler e escrever em valores como um número de threads utilizados globalmente, etc. É possível também determinar, por exemplo, se a seção atual está sendo executada em paralelo ou não (através da função ''omp_in_parallel''). É possível ligar ou desligar o ajustamento automático do número de ''threads'', através das funçãofunções ''omp_set_dynamic''. Entre várias outras que permitem a um programa ter informações úteis sobre o ambiente de execução.
 
Uma outra forma de especificar esses parâmetros é através de variáveis de ambiente que são lidas pelo runtime do OpenMP. As variáveis disponíveis são: OMP_SCHEDULE, OMP_NUM_THREADS, OMP_DYNAMIC, OMP_NESTED.
Linha 73 ⟶ 71:
Os compiladores que atualmente suportam OpenMP são o GCC a partir da versão 4.2 (4.1 no Fedora), o Visual Studio C++ 2005, os compiladores da Intel e o Sun Studio.
 
=== Vantagens e Desvantagensdesvantagens ===
 
As principais vantagens são:
 
* Simplicidade, pois o OpenMP cuida da maioria das coisas para o usuário e a distribuição de tarefas é feita automaticamente pela implementação;
* Paralelizar código já existente é simples, requer poucas modificações, e o paralelismo pode ser implementado de forma incremental, já que não requer grandes modificações estruturais no código. Por exemplo, no caso de um "for", o OpenMP cuida de quais threads irão fazer o que automaticamente e, em geral, o programa continacontinua sendo válido como um programa serial, caso o OpenMP não seja utilizado;
* Compacto, poderoso e simples.
 
Linha 91 ⟶ 89:
 
Como já citado anteriormente, o que fica mais claro quando se compara OpenMP com pthreads é que o OpenMP é bem mais simples. Contudo, também é possível perceber que com pthreads você pode conseguir alguma performance melhor caso otimize bastante seu código pois ele permite um controle mais fino.
 
[[Categoria:Programação paralela em arquiteturas multicore|{{SUBPAGENAME}}]]