BCC - Projeto de Sistemas Distribuídos

Exemplos

Construções OpenMP

  1. laco_paralelo_v0.c:
  2. Compilar o laco_paralelo_v1.c com gcc -Wall -Wextra -fopenmp laco_paralelo_v1.c -o v1 .
  3. Compile e teste o pi_v0.c. Esse é o código do cálculo do Pi usando a aproximação por integral, versão sem paralelização.
  4. Compile e teste a v1 paralelizada em pi_v1.c.
  5. Compile e teste a v2 paralelizada em pi_v2.c.
  6. Compile e teste a v3 paralelizada em 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.
  7. Compile e teste a v4 paralelizada em 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.
  8. Compilar o laco_paralelo_v2.c com gcc -Wall -Wextra -fopenmp laco_paralelo_v2.c -o v2 .
  9. Compilar o 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.
  10. Compile e teste a v5 paralelizada em 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.
  11. Compilar o 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.
  12. Compile e teste a v6 paralelizada em pi_v6.c. Essa versão usa reduções para simplificar o código.
  13. Perceba como o código abaixo tem uma dependência entre iterações do laço na variável j. Note que é possível resolver essa dependência desdobrando o cálculo, como feito na linha comentada.
    
    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);
    }