int i = 10;
#pragma omp parallel private(i)
{
printf("th %d: i = %d\n", omp_get_thread_num(), i);
i = 1000 + omp_get_thread_num();
}
printf("i = %d\n", i);
\pause Valor inicial de variáveis privadas é aleatório
\pause Modificações na região paralela não são visíveis fora dela
firstprivate é utilizada para inicializar variáveis privadas
int i = 10;
#pragma omp parallel firstprivate(i)
{
printf("th %d: i=%d\n", omp_get_thread_num(), i);
i = 1000 + omp_get_thread_num();
}
printf("i = %d\n", i);
\pause Modificações na região paralela não são visíveis fora dela
- lastprivate exporta o valor da __última iteração do laço__
Qual o valor impresso no printf caso
- private(soma)
- firstprivate(soma)
- lastprivate(soma)
- firstprivate(soma) lastprivate(soma)
int soma = 0; #pragma omp parallel for schedule (static) #pragma omp private(soma) for (i=0; i < MAX; i++) { soma += i; } printf ("soma = %d\n", soma);
\pause Qual operações nós precisamos para este algoritmo?
Cláusula reduction (op : list)
- op é uma operação, exemplo a soma ‘+’
- list é uma lista de variáveis
\pause Cada fluxo tem uma cópia inicializada
\pause Operação é feita no ponto de sincronização (join)
\pause Atribuído para a variável “global”
Vejamos um exemplo em __reduction.c__