📄 netmpi.c
字号:
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 + -