BCC - Projeto de Sistemas Distribuídos
Exemplos
Exemplos iniciais OpenMP
-
Compilar o
hello_serial.c com
gcc -Wall -Wextra hello_serial.c -o serial. Isso
deve gerar um arquivo chamado serial
-
Compilar o
hello_paralelo_compartilhado.c com
gcc -Wall -Wextra -fopenmp hello_paralelo_compartilhado.c
-o compartilhado
.
Isso deve gerar um arquivo chamado compartilhado.
-
Ao executar, ele deve imprimir as mensagens quatro
vezes, todas com ID = 0, pois essa variável é
compartilhada.
-
Compilar o
hello_paralelo_privado.c com
gcc -Wall -Wextra -fopenmp hello_paralelo_privado.c
-o privado
.
Isso deve gerar um arquivo chamado privado.
-
Ao executar, ele deve imprimir as mensagens quatro
vezes, com os IDs corretos, pois essa variável é
privada.
-
Execute o programa várias vezes e perceba o
não-determinismo: cada execução gera uma ordem de
impressão diferente!
-
Compilar o
barreira.c com
gcc -Wall -Wextra -fopenmp barreira.c -o barreira.
Isso deve gerar um arquivo chamado barreira.
-
Antes de executar o programa, faça
export OMP_NUM_THREADS=6
-
Execute o programa com
./barreira várias
vezes e perceba o não-determinismo novamente. Note
também a barreira de sincronização: os printf
que estão na área sequencial depois da área paralela
nunca aparecem antes da área paralela acabar.
-
Perceba que agora o código em C não diz ao OpenMP a
quantidade de threads na diretiva
#pragma omp parallel. A quantidade de threads
agora é definida pela variável de ambiente exportada
antes de executar o programa. Experimente com outros
valores.
-
Compilar o
hello_varias_paralelas.c com
gcc -Wall -Wextra hello_varias_paralelas.c -o varias
. Isso deve gerar um arquivo chamado varias.
-
Analise o código e a sua execução e perceba:
-
O funcionamento do modelo fork-join e das
barreiras.
-
Como é definida a quantidade de threads para
cada seção paralela: (1) usando o padrão ou a
variável de ambiente; (2) usando
num_threads; ou (3) usando
omp_set_num_threads (configura um novo
padrão).