素数判断
安装了docker的PC
**素数判断,要求用MPI_Probe的方式动态获取接收到素数,统一0号进程打印出来
第一:写一个函数来判断是否是素数
第二:进程 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进程。
注意大小写
#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;
}