MPI实验二:素数判断

实验二素数判断

1.实验目的和要求

素数判断

2.实验环境

安装了docker的PC

3.实验内容及实验数据记录

**素数判断,要求用MPI_Probe的方式动态获取接收到素数,统一0号进程打印出来

4.算法描述及实验步骤**

第一:写一个函数来判断是否是素数
第二:进程 0输入n和n个整数
第三:均分配到各个进程
第四:进程0自己处理的素数
第五:进程0接受其他进程传来的素数
第六:处理其他进程的素数,然后通过MPI_Send发送给进程0,接收时通过MPI_Probe(0,99,MPI_COMM_WORLD,&status);
MPI_Get_count(&status,MPI_INT,&count);
MPI_Recv(getNum,count,MPI_INT,0,99,MPI_COMM_WORLD,&status);进行预判接收,通过MPI_Send(sendNum,j,MPI_INT,0,98,MPI_COMM_WORLD)发送回去0进程。

5.调试过程

注意大小写

6. 实验结果

MPI实验二:素数判断_第1张图片

7.代码

#include
#include

int isPrime(int k)
{
    if(!k || k==1)
        return 0;
    for(int i=2;i*i<=k;i++)
        if(!(k%i))
            return 0;
    return 1;
}

int main(int argc,char **argv)
{
    int rank,size,n,num[100],getNum[100],aver;
    MPI_Init(&argc,&argv);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    if(rank==0)
    { 
        printf("Please input n:\n");
        scanf("%d",&n);
        aver=n/size;
        printf("Please input %d data:\n",n);
        for(int i=0;i<n;i++)
            scanf("%d",&num[i]);
        
        for(int i=1;i<size;i++)
            MPI_Send(num+i*aver,aver,MPI_INT,i,99,MPI_COMM_WORLD);
        for(int i=0;i<aver;i++)
            if(isPrime(num[i]))
            	printf("%d ,from process:%d,printer:%d\n",num[i],rank,rank);
        
        for(int i=1;i<size;i++)
        {
            int tempNum[aver];
            int count;
            MPI_Status status;
            MPI_Probe(MPI_ANY_SOURCE,98,MPI_COMM_WORLD,&status);
            MPI_Get_count(&status,MPI_INT,&count);
            MPI_Recv(tempNum,count,MPI_INT,status.MPI_SOURCE,status.MPI_TAG,MPI_COMM_WORLD,&status);
            //MPI_Recv(&j,1,MPI_INT,i,95,MPI_COMM_WORLD,&status); 
			for(int j=0;j<count;j++)
                printf("%d is Prime,from process %d,printer %d\n",tempNum[j],status.MPI_SOURCE,rank);
        }
    }
    else
    {
        int count;
        MPI_Status status;
        MPI_Probe(0,99,MPI_COMM_WORLD,&status);
        MPI_Get_count(&status,MPI_INT,&count);
        MPI_Recv(getNum,count,MPI_INT,0,99,MPI_COMM_WORLD,&status);
        
        int sendNum[count];
        int j=0;
        for(int i=0;i<count;i++)
            if(isPrime(getNum[i]))
                sendNum[j++]=getNum[i];
        MPI_Send(sendNum,j,MPI_INT,0,98,MPI_COMM_WORLD);      

    }
    MPI_Finalize();
    return 0;
}

你可能感兴趣的:(mpi)