09.05.2015 Views

universidade feevale douglas neves spindler algoritmos para ...

universidade feevale douglas neves spindler algoritmos para ...

universidade feevale douglas neves spindler algoritmos para ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

36<br />

A opção de utilizar diretivas de compilação ao invés de basear toda a implementação<br />

em extensões de linguagem tem como principal atrativo a possibilidade de utilizar um<br />

programa inicialmente desenvolvido puramente de forma sequencial e especificar o<br />

<strong>para</strong>lelismo onde necessário. Desta forma, um compilador normal simplesmente ignorará as<br />

diretivas OpenMP e gerará um executável sequencial, enquanto um compilador OpenMP<br />

produzirá uma versão <strong>para</strong>lela do mesmo programa (WILKINSON E ALLEN, 2005).<br />

Chandra et al. (2001) mencionam ainda que, inicialmente, foi considerada uma abordagem<br />

totalmente baseada em bibliotecas, mas que esta opção foi rejeitada por dois fatores: o fato de<br />

um compilador que não suporta OpenMP ignorar automaticamente as diretivas que<br />

especificam o <strong>para</strong>lelismo torna o código muito mais fácil de ser portado; e a possibilidade de<br />

realizar otimizações baseadas no compilador com o uso de tais diretivas. Visto que uma<br />

abordagem completamente voltada a diretivas também tornaria o desenvolvimento difícil,<br />

optou-se por utilizar algumas rotinas em conjunto com as mesmas.<br />

A API OpenMP utiliza o modelo de execução <strong>para</strong>lela fork-join. Wilkinson e Allen<br />

(2005, p. 233) conceituam este modelo, onde<br />

um comando fork gera um novo caminho <strong>para</strong> um processo concorrente e estes<br />

processos concorrentes usam um comando join ao final das execuções. Quando<br />

todos os comandos join são alcançados, a execução continua de modo sequencial.<br />

Para mais processos concorrentes são necessários comandos fork adicionais.<br />

A especificação da API, definida pelo OpenMP Architecture Review Board (2011),<br />

define que a execução de um programa OpenMP começa com uma única thread, chamada de<br />

thread mestra, a qual executa sequencialmente. A diretiva <strong>para</strong>llel cria um grupo de threads e<br />

especifica um bloco que será executado por este grupo de threads em <strong>para</strong>lelo.<br />

Chandra et al. (2001) dividem as rotinas e diretivas do modelo OpenMP em três<br />

categorias: estruturas de controle <strong>para</strong>lelo, ambiente de dados e sincronização.<br />

A primeira categoria – a mais relevante <strong>para</strong> este trabalho – consiste em estruturas<br />

que alteram o fluxo de controle em um programa. A diretiva básica é a já citada <strong>para</strong>llel. As<br />

outras diretivas nesta categoria são utilizadas <strong>para</strong> dividir o trabalho entre um grupo de<br />

threads em <strong>para</strong>lelo. Dentre estas, destacam-se as diretivas <strong>para</strong> definição de <strong>para</strong>lelismo em<br />

laços (loops), como for e do, nas quais focar-se-á <strong>para</strong> os propósitos deste trabalho. O padrão<br />

OpenMP provê diretivas específicas <strong>para</strong> tais situações, visto que frequentemente o<br />

<strong>para</strong>lelismo pode ser encontrado em laços. A Figura 11 ilustra a execução de um programa<br />

que faça uso da diretiva do <strong>para</strong> especificar as tarefas a serem executadas em <strong>para</strong>lelo:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!