OpenMP com Intel Edison

openmp

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:

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:

Execução sem OpenMP
Figura 1 – Execução sem OpenMP
htop sem OpenMP
Figura 2 – htop sem OpenMP

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:

Execução com OpenMP
Figura 3 – Execução com OpenMP
htop com OpenMP
Figura 4 – htop com OpenMP

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.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Software » Sistemas Operacionais » OpenMP com Intel Edison

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: