twin primes. serial and parallel

来源:互联网 发布:淘宝网什么时候搞活动 编辑:程序博客网 时间:2024/05/06 22:58
bool mark [N];
vector <int> primeList; void sieve () {memset (mark, true, sizeof (mark));mark [0] = mark [1] = false;for ( int i = 4; i < N; i += 2 )    mark [i] = false;for ( int i = 3; i * i <= N; i++ ){    if ( mark [i] )    {        for ( int j = i * i; j < N; j += 2 * i )            mark [j] = false;    }}primeList.clear ();primeList.push_back (2);for ( int i = 3; i < N; i += 2 ){    if ( mark [i] )        primeList.push_back (i);}//printf ("%d\n", primeList.size ()); }  int main (){sieve ();vector <int> twinPrime;for ( size_t i = 1; i < primeList.size (); i++ ){    if ( primeList [i] - primeList [i - 1] == 2 )        twinPrime.push_back (primeList [i - 1]);}int t;scanf("%d",&t);int s;while ( t-- ){    scanf("%d",&s);    printf ("%d %d\n", twinPrime [s - 1], twinPrime [s - 1] + 2);}return 0;



parallel version of twin primeszhuanzaizi

/* *Author:张华键 * *Date:2015/10/30 * *本程序用于并行求素数,给定一个整数n(本程序n <= 2^9*10^3),使用ceil(sqrt(n)/2)个进程进行筛选素数 * *数据区根据进程个数均等划分 * *主程序(0号进程)每找到一个素数k,就将其广播,其他从进程收到k,将本区间内k的倍数筛除 * */#include <stdio.h>#define MPICH_SKIP_MPICXX#include <mpi.h>#include <stdlib.h>#include <math.h>#pragma comment(lib,"mpi.lib")bool is_prime[512100];int data[1500]; //起步素数void Help(char* prog_name); //usage of the program/*  -------------------------------------------------------------------  *  主程序  *  ------------------------------------------------------------------- */ int main(int argc, char* argv[]){    int n,          //问题规模        mycount,    //单个进程中素数个数        allcount,   //总的素数个数        myrank,     //子任务标识        task_num,   //子任务个数        partion_size,       //子问题规模        begin,      //数据区间左端点        end;        //数据区间右端点    double  start_time,     //开始时间            end_time,       //结束时间            total_time,     //总时间(取所有进程时间中的最大值)            my_time;        //单个进程的时间    mycount = 0;    allcount = 0;    MPI_Init(&argc,&argv);  //MPI程序初始化    MPI_Comm_size(MPI_COMM_WORLD,&task_num);    //取子任务个数    MPI_Comm_rank(MPI_COMM_WORLD,&myrank);      //取子任务标识    if (argc != 2)      //参数个数为2:文件名以及问题规模n    {        Help(argv[0]);        exit(0);    }    if (myrank == 0)    {        n=atoi(argv[1]);    }    MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);   //主程序将获取的参数n广播    start_time= MPI_Wtime();    //开始时间    partion_size = (int)ceil(n*1.0/task_num);   //每个进程划分得到的数据规模    //左闭右开    begin = myrank * partion_size;    end = (myrank+1) * partion_size;    //保证第一组数据从2开始    if (begin < 2)        begin = 2;    //保证最后一组数据不越界    if (end > n+1)        end = n+1;    int i, k;    k = 0;    for (i = begin; i < end; i++)        is_prime[i] = true;    if (myrank == 0)    //主程序    {        int j;        fprintf (stdout, "\n正在使用%d个子任务,在查找%d之内的素数.\n",task_num,n);        for (i = 2; i < partion_size && i*i < n; i++)        {            if(is_prime[i])            {                for (j = i*i; j < partion_size; j = j+i)                    is_prime[j] = false;                data[k] = i;                //每找到一个素数就广播                //注意,广播的第3个参数指定了广播发送方,第4个参数指定了群组,群组中其他进程为接收方。                MPI_Bcast(data+k, 1, MPI_INT, 0, MPI_COMM_WORLD);                k++;            }        }        data[k] = 0;        //广播0表示结束        MPI_Bcast(data+k, 1, MPI_INT, 0, MPI_COMM_WORLD);    }    else    //从程序    {        int new_begin;        while (1)        {            //接收来自主程序的广播            MPI_Bcast(data+k, 1, MPI_INT, 0, MPI_COMM_WORLD);            //接收到0表示结束            if (data[k] == 0)   break;              //本区间中第一个能被data[k]整除的数            new_begin = begin+(data[k]-begin%data[k])%data[k];            if (new_begin>end)  break;            //筛掉data[k]的倍数            for (i = new_begin; i < end; i += data[k])                    is_prime[i] = false;            k++;        }    }    fprintf (stdout, "\nI'm process %d,the primes I found are:\n",myrank);    for (i = begin; i < end; i++)        if(is_prime[i])        {            mycount++;            fprintf(stdout, "%d ", i);        }    fprintf(stdout, "\n");    //素数个数归约    MPI_Reduce(&mycount,&allcount,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);     end_time = MPI_Wtime();    my_time = end_time - start_time;    //printf("\nI'm process %d,my running time is %f seconds\n",myrank,my_time);    //执行时间归约    MPI_Reduce(&my_time,&total_time,1,MPI_DOUBLE,MPI_MAX,0,MPI_COMM_WORLD);     if(myrank==0)    {        printf("\nTotal count of prime number:%d\n",allcount);                      printf("Elapsed time = %f seconds\n",total_time);        fflush(stdout);    }    MPI_Finalize();    return 0;}void Help(char* prog_name) {    fprintf(stderr, "Please input the command as follow: %s <n> \n", prog_name);    fprintf(stderr, " (n: number of elements)\n");}


原创粉丝点击