lunes, 23 de mayo de 2011

Ejemplos OpenMP

Amigos aquí les facilito tres códigos muy interesantes para analizar, se tratan sobre el famoso Hola Mundo, y   la aproximación de \[\pi\] mediante el método de rectangulos y de montecarlo.

Hola Mundo 

#include <omp.h>
#include <stdio.h>
 
int main (int argc, char *argv[]) 
{  int p,th_id;
   p=omp_get_num_procs(); 
   omp_set_num_threads(p);
   #pragma omp parallel private(th_id);
   {
     th_id = omp_get_thread_num();
     printf("Hello World from thread %d\n", th_id);
     }
   return 0;
 }

Aproximación de \[\pi\] por el método de rectangulos 

#include  <omp.h >
#include  <stdio.h >
#include  <time.h >
#include  <sys/time.h> 

int main (int argc, char *argv[]) 
{
    double area,x;
    int i,n;
    area = 0.0;
    printf("n="); scanf("%d",&n);
    #pragma omp parallel for private(x) reduction(+:area);
    for (i=0;i<n;i++) 
    {     x=(i+0.5)/n; 
          area += 4.0/(1.0+x*x);
    }
    printf("pi = %lf\n", area/n);
    return 0; 
}

Aproximación de \[\pi\] por el método de montecarlo. 

#include <stdlib.h>
#include <stdio.h>
int main(int argc,char *argv[])
{
 int count;
 int i;
 int local_count;
 int samples;
 int t;
 int tid;
 double x,y;
 unsigned short xi[3];
 samples=atoi(argv[1]);
 omp_set_num_threads(atoi(argv[2]));
 count=0;
 #pragma omp parallel private(xi,t,i,x,y,local_count);
 {
 local_count=0;
 xi[0]=atoi(argv[3]);
 xi[1]=atoi(argv[4]);
 xi[2]=tid=omp_get_thread_num();
 t = omp_get_num_threads();
 for (i=tid;i<samples;i += t){
 x=erand48(xi);
   y=erand48(xi);
   if(x*x + y*y <= 1.0) local_count +=1;
  }
 #pragma omp critical
   count += local_count;
 }
 printf("Estimate of pi: %7.5f\n",4.0*count/samples);
}

1 comentarios:

Luisa :3 dijo...

Gracias por tu aporte, me ha sido de gran ayuda C:

Publicar un comentario