laco_paralelo_v0.c:
gcc -Wall -Wextra laco_paralelo_v0.c -o v0.
Isso deve gerar um programa que não executa mais de uma
thread.
gcc -Wall -Wextra -fopenmp laco_paralelo_v0.c -o v0
.
Isso deve gerar um programa que executa várias threads.
gcc -Wall -Wextra -fopenmp laco_paralelo_v0.c -o v0
.
Isso deve gerar um programa que não executa mais de uma
thread.
laco_paralelo_v1.c com
gcc -Wall -Wextra -fopenmp laco_paralelo_v1.c -o v1
.
pi_v0.c. Esse é o código do
cálculo do Pi usando a aproximação por integral, versão sem
paralelização.
pi_v1.c.
time ./v1 para 1, 2, 4, 8
threads. Altere a quantidade de threads no início do
arquivo, em NUM_THREADS. Note que o desempenho
não escala com o aumento de threads, por conta do falso
compartilhamento.
pi_v2.c.
time ./v2 para 1, 2, 4, 8
threads. Veja que agora o padding resolve o
desempenho.
pi_v3.c. Essa
versão usa a variável sum local para não gerar falso
compartilhamento. Essa versão também usa a construção para
regiões críticas para alterar a variável compartilhada
pi.
pi_v4.c. Essa
versão usa a diretiva #pragma omp for. Note que agora o
controle do laço e a divisão de carga é feita automaticamente
pelo OpenMP: não precisamos mais fazer os cálculos de início e
fim para cada thread.
laco_paralelo_v2.c com
gcc -Wall -Wextra -fopenmp laco_paralelo_v2.c -o v2
.
soma.c com
gcc -Wall -Wextra -fopenmp soma.c -o soma
.
Adicione um printf dentro do for para mostrar
qual thread está executando cada iteração. Depois, teste as
variantes de distribuição de carga com schedule.
pi_v5.c. Essa
versão combina parallel for e simplifica bastante parte
do trabalho que já fizemos. Veja que voltamos a usar o vetor
sum[], com uma posição para cada thread guardar a sua
soma parcial.
media.c com
gcc -Wall -Wextra -fopenmp media.c -o media
.
Esse código calcula a média dos itens de um vetor usando
redução.
pi_v6.c. Essa
versão usa reduções para simplificar o código.
int i, j, A[MAX];
j = 5;
for (i = 0; i < MAX; ++i) {
j += 2;
// DEPENDÊNCIA ENTRE ITERAÇÕES!
// int j = 5 + 2 * (i+1);
A[i] = big(j);
}