#include <stdio.h> #include <omp.h> #define MAX_THREADS 4 static long num_steps = 100000; double step; int main() { int i, j; double pi, full_sum = 0.0; double start_time, run_time; double sum[MAX_THREADS]; step = 1.0 / (double)num_steps; for (j = 1; j <= MAX_THREADS; j++) { omp_set_num_threads(j); full_sum = 0.0; start_time = omp_get_wtime(); #pragma omp parallel { int i; int id = omp_get_thread_num(); int numthreads = omp_get_num_threads(); double x; sum[id] = 0.0; if (id == 0) printf(" num_threads = %d", numthreads); for (i = id; i < num_steps; i += numthreads) { x = (i + 0.5) * step; sum[id] = sum[id] + 4.0 / (1.0 + x * x); } } for (full_sum = 0.0, i = 0; i < j; i++) { full_sum += sum[i]; } pi = step * full_sum; run_time = omp_get_wtime() - start_time; printf("\n pi is %f in %f seconds %d thrds \n", pi, run_time, j); }
时间: 2024-02-15 20:27:17 浏览: 73
SeqList.h #include <stdio.h> //包含标准输入输出流的头文件 #include <assert.h
这段代码是一个使用数值积分方法计算Pi的值,采用OpenMP并行化的程序。程序的主要思路是将计算任务分配给不同的线程,每个线程计算一部分,最后将结果累加得到最终的结果。
具体来说,程序首先定义了一个常量num_steps表示划分的区间数,step表示每个小区间的长度。然后,程序循环遍历不同的线程数,对于每个线程数,程序使用omp_set_num_threads函数设置使用的线程数,然后进入并行计算的代码段。
在并行计算的代码段中,程序首先使用omp_get_thread_num函数获取当前线程的编号,并使用omp_get_num_threads函数获取总线程数。然后,程序使用for循环将任务平均分配给不同的线程,每个线程计算自己分配到的部分,并将结果存储在sum数组中。
最后,程序使用for循环将所有线程计算的结果累加得到full_sum,然后根据公式计算出Pi的值,并输出结果及计算时间。
需要注意的是,在并行计算的代码段中,sum数组是每个线程私有的,因此需要在最后使用for循环将所有线程的结果累加得到最终结果。另外,程序中使用了OpenMP的pragma指令来指定并行计算的方式,具体可以参考OpenMP的相关文档。
阅读全文