#include "stdafx.h" #ifdef _OPENMP #include #endif #include #include #include void PI(double a, double b, int numIntervals, double* global_result_p) { int i; double x, my_result, sum = 0.0, interval, local_a, local_b, local_numIntervals; int myThread = omp_get_thread_num(); int numThreads = omp_get_num_threads(); interval = (b-a)/ (double) numIntervals; local_numIntervals = numIntervals/numThreads; local_a = a + myThread*local_numIntervals*interval; local_b = local_a + local_numIntervals*interval; sum = 0.0; for (i = 0; i < local_numIntervals; i++) { x = local_a + i*interval; sum = sum + 4.0 / (1.0 + x*x); }; my_result = interval * sum; # pragma om critical *global_result_p += my_result; } int main(int argc, char* argv[]) { double global_result = 0.0; volatile DWORD dwStart; int n = 100000000; printf("numberInterval %d \n", n); int numThreads = strtol(argv[1], NULL, 10); dwStart = GetTickCount(); # pragma omp parallel num_threads(numThreads) PI(0, 1, n, &global_result); printf("number of threads %d \n", numThreads); printf("Pi = %f \n", global_result); printf_s("milliseconds %d \n", GetTickCount() - dwStart); }