计算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,在分析加速比后,发现随着所分配线程的增多,加速比增大,可以得出结论程序并行化加快程序执行时间。

posted @ 2017-12-14 19:43  奇热行  阅读(443)  评论(0)    收藏  举报