# 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.