计算2到1,000,000之间的素数,采用OpenMP编程方案
计算2到1,000,000之间的素数,采用OpenMP编程方案,将结果输出到一个文件,与串行版本程序比较;并在屏幕上显示寻找到的素数个数,并分析线程数从1到8的加速比。
1)这里加速比是串行与并行系统中的执行时间的比值。
2)为了得到程序的执行时间,我用到了omp_get_wtime()。
串行版本:
#include<stdio.h> #include<math.h> #include<omp.h> void main() { int m,i,k,count=0; double starttime, endtime, time; FILE *fp=fopen("prime.txt","w"); starttime = omp_get_wtime(); for(m=2;m<=1000000;m=m+1) { k=sqrt(m); for(i=2;i<=k;i++) { if(m%i==0) break; } if(i>k) { fprintf(fp,"%d\t",m); count++; } } endtime = omp_get_wtime(); time = (endtime - starttime) * 1000; printf("count:%d,time = %13.5f ms\n",count,time); }
操作截图:

count为素数个数,time为执行时间。
并行版本:
#include<stdio.h> #include<math.h> #include<omp.h> void main() { int m,k,i,count=0; double starttime, endtime, time; FILE *fp=fopen("prime.txt","w"); starttime = omp_get_wtime(); #pragma omp parallel for private(i,k,m) for(m=2;m<=1000000;m=m+1) { k=sqrt(m); for(i=2;i<=k;i++) { if(m%i==0) break; } if(i>k) { fprintf(fp,"%d\t",m); #pragma omp atomic count++; } } endtime = omp_get_wtime(); time = (endtime - starttime) * 1000; printf("count = %d,time = %13.5f ms,Speedup = %lf\n",count,time,1776.64727/time); }
操作截图(4次运行结果相同证明程序并行化正确):

Speedup为加速比,count为素数个数,time为执行时间。
线程数为1:
操作截图:

线程数为2:
操作截图:

线程数为3:
操作截图:

线程数为4:
操作截图:

线程数为5:
操作截图:

线程数为6:
操作截图:

线程数为7:
操作截图:

线程数为8:
操作截图:

采用OpenMP编程方案计算2到1,000,000之间的素数,一开始并没有得到正确的结果(78498个素数),观察结果后我发现代码中有数据竞争在count++这里,所以我把它变成临界区用#pragma omp atomic,在分析加速比后,发现随着所分配线程的增多,加速比增大,可以得出结论程序并行化加快程序执行时间。

浙公网安备 33010602011771号