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

📄 netmpi.c

📁 fortran并行计算包
💻 C
📖 第 1 页 / 共 2 页
字号:
		    t0 = When();		    for (j = 0; j < nrepeat; j++)		    {			if (bHeadToHead)			    SendRecvData(&args);			else			{			    SendData(&args);			    if (!streamopt)			    {				RecvData(&args);			    }			}			if (bNoCache)			{			    args.buff += args.bufflen;			    /* args.buff1 += args.bufflen; */			}		    }		    t = (When() - t0)/((1 + !streamopt) * nrepeat);		    		    if (!streamopt)		    {			t2 += t*t;			t1 += t;			bwdata[n].t = MIN(bwdata[n].t, t);		    }		}		if (!streamopt)		    SendTime(&args, &bwdata[n].t, &nzero);		else		    RecvTime(&args, &bwdata[n].t, &nzero);				if (!streamopt)		    bwdata[n].variance = t2/TRIALS - t1/TRIALS * t1/TRIALS;			    }	    else	    {		bwdata[n].t = LONGTIME;		t2 = t1 = 0;		for (i = 0; i < TRIALS; i++)		{		    if (bNoCache)		    {			if (bufalign != 0)			{			    args.buff = memtmp + ((bufalign - ((MPI_Aint)args.buff % bufalign) + bufoffset) % bufalign);			    /* args.buff1 = memtmp1 + ((bufalign - ((MPI_Aint)args.buff1 % bufalign) + bufoffset) % bufalign); */			}			else			{			    args.buff = memtmp;			    /* args.buff1 = memtmp1; */			}		    }		    		    Sync(&args);		    t0 = When();		    for (j = 0; j < nrepeat; j++)		    {			if (bHeadToHead)			    SendRecvData(&args);			else			{			    RecvData(&args);			    if (!streamopt)				SendData(&args);			}			if (bNoCache)			{			    args.buff += args.bufflen;			    /* args.buff1 += args.bufflen; */			}		    }		    t = (When() - t0)/((1 + !streamopt) * nrepeat);		    		    if (streamopt)		    {			t2 += t*t;			t1 += t;			bwdata[n].t = MIN(bwdata[n].t, t);		    }		}		if (streamopt)		    SendTime(&args, &bwdata[n].t, &nzero);		else		    RecvTime(&args, &bwdata[n].t, &nzero);				if (streamopt)		    bwdata[n].variance = t2/TRIALS - t1/TRIALS * t1/TRIALS;			    }	    tlast = bwdata[n].t;	    bwdata[n].bits = args.bufflen * CHARSIZE;	    bwdata[n].bps = bwdata[n].bits / (bwdata[n].t * 1024 * 1024);	    bwdata[n].repeat = nrepeat;	    	    if (args.tr)	    {		if (bSavePert)		{		/* fprintf(out,"%f\t%f\t%d\t%d\t%f\n", bwdata[n].t, bwdata[n].bps,		    bwdata[n].bits, bwdata[n].bits / 8, bwdata[n].variance); */		    if (bUseMegaBytes)			fprintf(out,"%d\t%f\t%0.9f\n", bwdata[n].bits / 8, bwdata[n].bps / 8, bwdata[n].t);		    else			fprintf(out,"%d\t%f\t%0.9f\n", bwdata[n].bits / 8, bwdata[n].bps, bwdata[n].t);		    fflush(out);		}	    }	    if (!one_buffer)	    {		free(memtmp);		free(memtmp1);	    }	    if (args.tr && printopt)	    {		if (bUseMegaBytes)		    fprintf(stdout," %6.2f MBps in %0.9f sec\n", bwdata[n].bps / 8, tlast);		else		    fprintf(stdout," %6.2f Mbps in %0.9f sec\n", bwdata[n].bps, tlast);		fflush(stdout);	    }	} /* End of perturbation loop */		if (!bSavePert && args.tr)	{	    /* if we didn't save all of the perturbation loops, find the max and save it */	    int index = 1;	    double dmax = bwdata[n-1].bps;	    for (; ipert > 1; ipert--)	    {		if (bwdata[n-ipert].bps > dmax)		{		    index = ipert;		    dmax = bwdata[n-ipert].bps;		}	    }	    if (bUseMegaBytes)		fprintf(out,"%d\t%f\t%0.9f\n", bwdata[n-index].bits / 8, bwdata[n-index].bps / 8, bwdata[n-index].t);	    else		fprintf(out,"%d\t%f\t%0.9f\n", bwdata[n-index].bits / 8, bwdata[n-index].bps, bwdata[n-index].t);	    fflush(out);	}    } /* End of main loop  */	    if (args.tr)	fclose(out);    /* THE_END:		 */    CleanUp(&args);    free(bwdata);    return 0;}/* Return the current time in seconds, using a double precision number. 	 */double When(){    return MPI_Wtime();}int Setup(ArgStruct *p){    int nproc;    char s[255];    int len = 255;        MPI_Comm_rank(MPI_COMM_WORLD, &p->prot.iproc);    MPI_Comm_size(MPI_COMM_WORLD, &nproc);        MPI_Get_processor_name(s, &len);    /*gethostname(s, len);*/    printf("%d: %s\n", p->prot.iproc, s);    fflush(stdout);        if (p->prot.iproc == 0)	p->prot.nbor = 1;    else	p->prot.nbor = 0;        if (nproc < 2)    {	printf("Need two processes\n");	printf("nproc: %i\n", nproc);	exit(-2);    }        if (p->prot.iproc == 0)	p->tr = 1;    else	p->tr = 0;    return 1;	}	void Sync(ArgStruct *p){    char ch;    MPI_Status status;    if (p->tr)    {	MPI_Send(&ch, 0, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD);	MPI_Recv(&ch, 0, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD, &status);	MPI_Send(&ch, 0, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD);    }    else    {	MPI_Recv(&ch, 0, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD, &status);	MPI_Send(&ch, 0, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD);	MPI_Recv(&ch, 0, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD, &status);    }}int DetermineLatencyReps(ArgStruct *p){    MPI_Status status;    double t0, duration = 0;    int reps = 1, prev_reps = 0;    int i;    /* prime the send/receive pipes */    Sync(p);    Sync(p);    Sync(p);    /* test how long it takes to send n messages      * where n = 1, 2, 4, 8, 16, 32, ...     */    t0 = When();    t0 = When();    t0 = When();    while ( (duration < 1) ||	    (duration < 3 && reps < 1000))    {	t0 = When();	for (i=0; i<reps-prev_reps; i++)	{	    Sync(p);	}	duration += When() - t0;	prev_reps = reps;	reps = reps * 2;	/* use duration from the root only */	if (p->prot.iproc == 0)	    MPI_Send(&duration, 1, MPI_DOUBLE, p->prot.nbor, 2, MPI_COMM_WORLD);	else	    MPI_Recv(&duration, 1, MPI_DOUBLE, p->prot.nbor, 2, MPI_COMM_WORLD, &status);    }    return reps;}double TestLatency(ArgStruct *p){    double latency, t0;    int i;    g_LATENCYREPS = DetermineLatencyReps(p);    if (g_LATENCYREPS < 1024 && p->prot.iproc == 0)    {	printf("Using %d reps to determine latency\n", g_LATENCYREPS);	fflush(stdout);    }    p->bufflen = 0;    p->buff = NULL; /*(char *)malloc(p->bufflen);*/    p->buff1 = NULL; /*(char *)malloc(p->bufflen);*/    Sync(p);    t0 = When();    t0 = When();    t0 = When();    t0 = When();    for (i = 0; i < g_LATENCYREPS; i++)    {	if (p->tr)	{	    SendData(p);	    RecvData(p);	}	else	{	    RecvData(p);	    SendData(p);	}    }    latency = (When() - t0)/(2 * g_LATENCYREPS);    /*    free(p->buff);    free(p->buff1);    */    return latency;}double TestSyncTime(ArgStruct *p){    double synctime, t0;    int i;    t0 = When();    t0 = When();    t0 = When();    t0 = When();    t0 = When();    t0 = When();    for (i = 0; i < g_LATENCYREPS; i++)	Sync(p);    synctime = (When() - t0)/g_LATENCYREPS;    return synctime;}void SendRecvData(ArgStruct *p){    MPI_Status status;        /*MPI_Sendrecv(p->buff, p->bufflen, MPI_BYTE, p->prot.nbor, 1, p->buff1, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD, &status);*/    MPI_Request request;    MPI_Irecv(p->buff1, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD, &request);    MPI_Send(p->buff, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD);    MPI_Wait(&request, &status);    /*    MPI_Send(p->buff, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD);    MPI_Recv(p->buff1, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD, &status);    */}void SendData(ArgStruct *p){    MPI_Send(p->buff, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD);}void RecvData(ArgStruct *p){    MPI_Status status;    MPI_Recv(p->buff1, p->bufflen, MPI_BYTE, p->prot.nbor, 1, MPI_COMM_WORLD, &status);}void SendTime(ArgStruct *p, double *t, int *rpt){    if (*rpt > 0)	MPI_Send(rpt, 1, MPI_INT, p->prot.nbor, 2, MPI_COMM_WORLD);    else	MPI_Send(t, 1, MPI_DOUBLE, p->prot.nbor, 2, MPI_COMM_WORLD);}void RecvTime(ArgStruct *p, double *t, int *rpt){    MPI_Status status;    if (*rpt > 0)	MPI_Recv(rpt, 1, MPI_INT, p->prot.nbor, 2, MPI_COMM_WORLD, &status);    else	MPI_Recv(t, 1, MPI_DOUBLE, p->prot.nbor, 2, MPI_COMM_WORLD, &status);}int Establish(ArgStruct *p){    return 1;}int  CleanUp(ArgStruct *p){  /*MPI_Barrier(MPI_COMM_WORLD);*/    MPI_Finalize();    return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -