⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spmd2.c

📁 Parallel programming/Lou Baker, Bradley J.Smith .—New York:McGraw-Hill Book Co.
💻 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 + -