OpenMP (Open Multi-Processing) é uma API e conjunto de diretivas de compilação que permite o desenvolvimento de aplicações com processamento paralelo para utilizar todo o potencial de processadores multi-core ou então para múltiplos processadores que compartilhem a mesma memória principal.
Ela tem suporte para as linguagens C, C++ e Fortran. E funciona por meio de diretivas como uma extensão do compilador que precisa ser compatível com a OpenMP.
Processamento paralelo é um assunto muito complexo e a OpenMP tem inúmeros recursos, mas aqui iremos abordar apenas uma introdução ao tema e os primeiros passos para a utilização desse recurso na Intel Edison, que conta com um microprocessador Intel Atom dual-core.
Para quem está em seus primeiros contatos com a Intel Edison eu recomendo fortemente a leitura de três textos incríveis:
- Intel Edison Linux – Dicas e Truques, por Diego Sueiro;
-
Introdução ao Intel Edison, por Pacman e;
OpenMP na Intel Edison
Nos testes vou utilizar a distribuição Linux Ubilinux, baseada no Debian 7 “Wheezy” e customizada para a Intel Edison, por ela ter suporte total ao OpenMP. Caso você também tenha interesse em instalar a Ubilinux na sua Intel Edison, basta seguir as instruções deste guia da Sparkfun.
Primeiro conecte a placa na internet, abra um terminal via ssh, atualize, e baixe o htop para monitorarmos o uso dos núcleos do Intel Atom.
root@ubilinux:~# apt-get update -y root@ubilinux:~# apt-get install htop -y root@ubilinux:~# htop
Deixe o htop aberto e abra outro terminal para executar o teste enquanto monitora o uso do processador.
Crie um arquivo main.c, e utilize o código abaixo.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
#define N 10000000 // tamanho do array
int main (void)
{
long double *a;
int i;
a = (long double*) malloc(N*sizeof(long double)); // aloca a memória para nosso array
#pragma omp parallel for // diretiva para que o "for" utilize todos os cores disponíveis
for (i=0; i<N; i++) {
a[i] = pow(i, 2.4);
a[i] = sqrt(a[i]);
a[i] *= 0.1;
a[i] /= 0.2;
}
printf("value: %Lf\n", a[N-1]); // imprime o valor da última interação
return 0;
}
O código é muito simples, e roda um loop onde fazemos operações matemáticas comuns apenas para mensurarmos a diferença do tempo utilizando um ou dois cores do processador.
Sem OpenMP
Agora vamos compilar e rodar o nosso programa da forma tradicional, medindo o tempo que ele levará para completar a rotina.
root@ubilinux:~# gcc main.c -o main.out -lm root@ubilinux:~# time ./main.out
Resultados:
Com OpenMP
Agora vamos compilar utilizando a opção -fopenmp no GCC e depois rodar a aplicação novamente.
root@ubilinux:~# gcc main.c -o main.out -lm -fopenmp root@ubilinux:~# time ./main.out
Resultados:

Conclusão
A utilização do OpenMP permitiu, com a adição de apenas uma linha de código, utilizarmos o potêncial total dos dois núcleos do processador principal da Intel Edison e praticamente reduzir pela metade o tempo de execução da nossa rotina.








