Código - CarlosBielma/Actividad-1.4 GitHub Wiki
Se inlcuyen las librerías a usarse
#include <stdio.h>
#include "omp.h"
Se crean las variables globales
static long num_pasos=100000000; //en esta variable se definen los 1x10^8 puntos
double paso;
#define NUM_THREADS 160 //Aquí es donde definimos los hilos a usar
Se crea el arreglo que van a usar los hilos para almacenar el resultado, se crean los hilos y se inicia el reloj de ejecución.
void main()
{
int i, nthreads; double pi, sum[NUM_THREADS],t1,t2,tiempo;
paso=1.0/num_pasos;
omp_set_num_threads(NUM_THREADS);
const double startTime = omp_get_wtime();
Se crea la función que va a ejecutarse en paralelo para la integral definida
#pragma omp parallel
{
int i, id, nthrds; double x;
id = omp_get_thread_num();
nthrds = omp_get_num_threads();
if(id==0){
nthreads=nthrds;
}
for(i=id, sum[id]=0.0; i<num_pasos; i=i+nthrds){
x=(i+0.5)*paso;
sum[id]+=4.0/(1.0+x*x);
}
}
Se suman los resultados de cada hilo y multiplican por el paso
for(i=0, pi=0.0; i<nthreads;i++){
pi+=sum[i]*paso;
}
Finalmente se detiene el reloj de ejecución se hace la diferencia para obtener el tiempo total de ejecución, y se imprimen tanto este, como el resultado de la integral definida
const double endTime = omp_get_wtime();
tiempo=t2-t1;
printf("pi = (%lf\n",pi);
printf("tomo (%lf) segundos\n",(endTime - startTime)); //Se imprime el tiempo de ejeccución
}