📄 spmd2.c
字号:
/* PSPH Parallel SPH Program
* Bradley Smith, and Lou Baker, Dagonet Software
*
* test of Scatter, Gather, etc. SPMD
*
*/
/* static char sccs_id[]="%Z% %P% %I% %D%"; */
#define DEBUG
#include "all.h"
/* ultimately, move below to tag.h! */
#define DUMP_CSPTAG (TAG_BASE + 17)
#define DUMP_FSPTAG (TAG_BASE + 18)
#define DUMP_ISPTAG (TAG_BASE + 19)
#define DUMP_CMATTAG (TAG_BASE + 20)
#define DUMP_IMATTAG (TAG_BASE + 21)
int *PVM_tid,PVM_proc,PVM_nproc;
char LogFile[128];
/* MASTER */
FILE *fn;
#ifdef DEBUG
FILE *diagn;
#endif
main(int argc,char **argv)
{
int From, numt,mytid,flag,halfrank,i,comm,reckt;
char **sargv,where[20],direction, name[20];
char buf[100]; int recbuf[100],sendbuf[100];
#ifdef DEBUG
diagn=fopen("master.dia","w");
fprintf(diagn," master starting\n");
/*printf(" master starting\n");
printf(" argv=%s\n",argv[1]);
*/
#endif
halfrank=atoi(argv[1]);
numt=atoi(argv[2]);
printf(" halfrank=%d\n",halfrank);
sargv = (char **)malloc( 4* sizeof( char *));
sargv[0]=(argv[1]);
sargv[1]=argv[2];
sargv[2]=NULL;
fprintf(diagn," REQUESTED number of processes=%d\n",numt);
if(numt<=1) {fprintf(diagn," Bad numberof processes requested\n",TRUE);
exit(1);}
strcpy(name,"spmd2");
where[0]='\0';/*if flag=0, where not used?*/
flag=0;/* no specific host*/
reckt=PVM_GInit(name,sargv,flag,where,numt);
/*numt=pvm_spawn("spmd2",sargv,flag,where,1,&tids);*/
Debug(" number of SPAWNED processes=%d Rank=%d halfrank=%d\n",numt,Rank,halfrank);
/* do the scatters and the gathers and Bcasts */
/* halfrank= numt/2;*/
/* halfrank=0 */
comm=Comm;
if(Rank==halfrank)
{
/* copy hafrank to buf */
memcpy(recbuf,&halfrank,sizeof(int));
Debug(" packed buffer with %d\n",halfrank);
}
Debug(" Before broadcast\n");
/* halfrank here is root of bcast*/
MPI_Bcast(recbuf, 1,MPI_INT, halfrank, comm);/* root->all*/
/* report*/
Debug(" BCAST Rank=%d got: %d half=%d\n", Rank,recbuf[0],halfrank);
/* all send SAME kind of data to root */
memcpy(sendbuf,&Rank,sizeof(int));
for(i=0;i<numt;i++)recbuf[i]=-1;
reckt=1;
MPI_Allgather(sendbuf,1,MPI_INT,recbuf,reckt,MPI_INT,halfrank,comm);
if(Rank==halfrank)
{
Debug(" reckt=%d\n",reckt);
for(i=0;i<numt;i++)Debug(" got %d as %d data\n",recbuf[i],i);
}
/* root takes in report from each*/
for(i=0;i<numt;i++)recbuf[i]=-1;
sendbuf[0]=Rank*10;
MPI_Gather(sendbuf,1,MPI_INT,recbuf,reckt,MPI_INT,halfrank,comm);/* all->root*/
if(Rank==halfrank)for(i=0;i<numt;i++)Debug("Gather got %d from %d\n",recbuf[i],i);
/* root sends a different message to each */
for(i=0;i<numt;i++)recbuf[i]=-1;
if(Rank==halfrank)for(i=0;i<numt;i++)sendbuf[i]=i*10-5;
MPI_Scatter(sendbuf,1,MPI_INT,recbuf,reckt,MPI_INT,halfrank,comm);/* root->all*/
Debug(" SCATTER:Rank=%d got: %d\n", Rank,recbuf[0]);
if(!Rank)Debug(" root flushing messages\n");
if(!Rank)Debug(" root flushing messages\n");
if(!Rank)Debug(" root flushing messages\n");
if(!Rank)Debug(" root flushing messages\n");
if(!Rank)Debug(" root flushing messages\n");
if(!Rank)Debug(" root flushing messages\n");
if(!Rank)Debug(" root flushing messages\n");
if(!Rank)Debug(" root flushing messages\n");
if(!Rank)Debug(" root flushing messages\n");
pvm_exit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -