Aula 11/04¶
OpenMP¶
O OpenMP é uma especificação que vai implementar o multthreading. Vai usar certas ferramentas de acordo com o copilador e o SO. Por exemplo, ao usar OpenMP copilado no GCC e rodando no linux, o pragma vai fazer uma implementação do PThreads muito mais otimizada.
Procurar OpenMP cheatsheet para ver todas as coisas da especificação.
#pragma omp parallel for: uma anotação que reliza um tipo de metaprogramação no codigo.- Com
num_threads(2)a gente pode especificar o numero de threads que vamos usar. #pragma omp critical(NOME_DA_SC) {}: reliza uma sessão critica com o codigo entre parenteses.- Para compilar usando o OpenMP, é preciso usar a flag
-fopenmp. - Quando eu executo meu programa com mais threads doq meu computador possui isso é chamado “green-threads”, que são uma especie de pseudothreads.
- Uma operação de redução é quando reunimos o resultado de operações de varias threads em torno de um resultado unico e final. No caso do codigo abaixo, o
acc +=não vai adicionar diretamente na variavel acc definida anteriomente, e sim e variaveis criadas pelo openmp que vão ser depois unidas, em uma forma de divide and conquer.
double acc = 0.0;
#pragma omp parallel for private(i) reduction(+:acc)
for (i = 0; i < n; i++){
double x = (i*2)/2;
acc += sqrt(1 - (x*x)) * i;
}
return acc;
No codigo acima, o openmp dividiu o trabalho em partes iguais, e não em partes dinamicas. Ou seja, um processo pode terminar antes de outros, dividindo de forma dinamica, a divisão de trabalho não é feita de forma igual e os trabalhos podem ter diferentes tamanhos.