Escolar Documentos
Profissional Documentos
Cultura Documentos
RIO VERDE - GO
2014
INTRODUÇÃO
Este trabalho visa relatar a comparação no apecto prático entre um script utilizando técnicas de
Processamento Paralelo e Processamento Linear utilizando o padrão OpenMP em sistema SMP
(Symetric Multiprocessor System) .
A máquina utilizada tem a seguinte configuração de processamento:
O SCRIPT
O script em C compilado diretamente pelo Terminal Shell do sistema operacional Ubuntu (pois
possui o pacote de métodos e classes OpenMP nativos) executa a função simples de uma
estrutura de looping “for” que irá somar valores:
soma = soma +
O objetivo do código será acumular a somatória dos números reais inteiros entre 0 e 1.000.000.
Utilizando métodos de somatória de tempo para do pacote OpenMP (omp.h) tanto para o teste
linear quanto para o paralelo para aferir o desempenho. Temos o seguinte script para nossa
aplicação linear:
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
int max=1000000;
double soma=0;
double end=0, start=0, tempo=0;
for(i=0; i<=max; i++){
soma=soma+i;
}
end = omp_get_wtime();
tempo=end-start;
printf("Soma: %.0f \n", soma);
if(tempo>=1)
printf("Tempo: %.5f segundos \n", tempo);
else
printf("Tempo: %.5f milisegundos \n", tempo*1000);
}
Quando executamos o código temos os seguintes resultados:
Percebemos que o valor da somatória está condizente com o real 500.000.500.000 e que o
tempo de execução este entre 8,02151 e 13,14910 milissegundos. Esta oscilação se dá porque o
sistema está processando outras informações além do nosso script.
DIRETIVAS OPENMP UTILIZADAS
As diretivas do OpenMP são baseadas na diretiva #pragma definida no padrão da linguagem
C/C++. Os compiladores que suportam OpenMP em C/C++ possuem uma opção de linha de
comando que ativa e permite a interpretação das diretivas do OpenMP.
FORMATO DAS DIRETIVAS
O formato padrão de uma diretiva OpenMP é mostrado a seguir:
Neste trecho a linha “#pragma omp parallel for” permite que cada processo matemático seja
executado pela thred que está disponível. Porém acarreta o erro ao resultado final pelo fato de
deixar que uma thred execute o cálculo simultaneamente a outra desencadeando uma falha de
gravação dos dados.
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
int i;
int max=1000000;
double soma=0;
double end=0, start=0, tempo=0;
start = omp_get_wtime();
omp_set_num_threads(4);
#pragma omp parallel for reduction(+:soma)
for(i=0; i<=max; i++){
soma=soma+i;
}
end = omp_get_wtime();
tempo=end-start;
printf("Soma: %.0f \n", soma);
if(tempo>=1)
printf("Tempo: %.5f segundos \n", tempo);
else
printf("Tempo: %.5f milisegundos \n", tempo*1000);
}
Executando o código:
Observamos que o resultado foi um mais satisfatório ficando com o tempo de processamento
entre 3,96904 e 6,98969 milissegundos contra 8,02151 e 13,14910 milissegundos.
Conclusão
Comparando as médias entre os resultados:
Script Linear 10,5853305 milissegundos
Script Paralelo 5,479365 milissegundos
Ganho de tempo 48,24%