void sbuf_mem(struct sbuf *sbuf, char *s, int len) { if (sbuf->s_n + len + 1 >= sbuf->s_sz) sbuf_extend(sbuf, NEXTSZ(sbuf->s_sz, len + 1)); memcpy(sbuf->s + sbuf->s_n, s, len); sbuf->s_n += len; }
int main(int argc, char **argv) { int dopingpongtest = 0; int dofloodtest = 0; int dobarriertest = 0; int doexchangetest = 0; int doqueuetest = 0; int iters = -1; /* init */ startupMPI(&argc, &argv); /* parse arguments */ if (argc < 2) Usage(argv[0]); { char *p; for (p = argv[1]; *p; p++) { switch(*p) { case 'E': case 'e': doexchangetest = 1; break; case 'P': case 'p': dopingpongtest = 1; break; case 'F': case 'f': dofloodtest = 1; break; case 'B': case 'b': dobarriertest = 1; break; case 'Q': case 'q': doqueuetest = 1; break; default: Usage(argv[0]); } } } if (argc > 2) iters = atoi(argv[2]); else iters = 10000; if (iters <= 0) Usage(argv[0]); if (argc > 3) queuedepth = atoi(argv[3]); else queuedepth = 64; if (queuedepth <= 0) Usage(argv[0]); if (dobarriertest) { /* barrier test */ double totaltime; if (rank == 0) { printf("=====> testmpiperf-barrier nprocs=%d config=MPI\n", nproc); printf("running %i iterations of barrier test...\n", iters); fflush(stdout); } barriertest(1); /* "warm-up" run */ totaltime = barriertest(iters); if (rank == 0) { printf("barrier latency= %9.3f us, totaltime= %9.3f sec\n", totaltime/iters, totaltime/1000000); fflush(stdout); } barrier(); } barrier(); if (dopingpongtest) { /* ping-pong test */ if (rank == 0) { printf("=====> testmpiperf-pingpong nprocs=%d config=MPI\n", nproc); printf("running %i iterations of ping-pong %s test (%s-byte ack)...\n", iters, (USE_ISEND ? "MPI_ISend/MPI_IRecv" : "MPI_Send/MPI_IRecv"), (USE_ZERO_BYTE_ACK?"0":"N")); fflush(stdout); } barrier(); { int msgsz; for (msgsz = FIRSTSZ(); !DONESZ(msgsz); msgsz = NEXTSZ(msgsz)) { double totaltime; pingpongtest(1, msgsz); /* "warm-up" run */ barrier(); totaltime = pingpongtest(iters, msgsz); barrier(); if (rank % 2 == 0) { printf("P%i-P%i: size=%8i bytes, latency= %9.3f us, bandwidth= %11.3f KB/sec\n", rank, peerid, msgsz, totaltime/iters, (((double)msgsz)*iters/KB)/(totaltime/1000000)); fflush(stdout); } } } } barrier(); if (dofloodtest) { /* flood test */ if (rank == 0) { printf("=====> testmpiperf-flood nprocs=%d config=MPI\n", nproc); printf("running %i iterations of flood MPI_Isend/MPI_Irecv test per size, with queuedepth=%i...\n", iters, queuedepth); printf("Flood test using %s method\n", mpi_testwait_desc); fflush(stdout); } barrier(); { int msgsz; for (msgsz = FIRSTSZ(); !DONESZ(msgsz); msgsz = NEXTSZ(msgsz)) { double totaltime; floodtest(queuedepth, msgsz); /* "warm-up" run */ barrier(); totaltime = floodtest(iters, msgsz); barrier(); if ((rank % 2 == 1) || peerid == rank) { /* report reciever times on flood test */ printf("P%i-P%i: size=%8i bytes, inv. throughput= %9.3f us, bandwidth= %11.3f KB/sec\n", rank, peerid, msgsz, totaltime/iters, (((double)msgsz)*iters/KB)/(totaltime/1000000)); fflush(stdout); } } } } fflush(NULL); sleep(1); /* pause for output */ barrier(); if (doqueuetest) { /* queue test */ if (rank == 0) { printf("=====> testmpiperf-queue nprocs=%d config=MPI\n", nproc); printf("running %i iterations of MPI_Isend queue test per size, with maxqueuedepth=%i...\n", iters, queuedepth); { char header[1024]; char *pheader = header; int depth; sprintf(pheader, " "); pheader += strlen(pheader); for (depth = 1; depth <= queuedepth; depth *= 2) { sprintf(pheader, " %7i", depth); pheader += strlen(pheader); } printf("%s\n", header); } fflush(stdout); } barrier(); { int msgsz; for (msgsz = FIRSTSZ(); !DONESZ(msgsz); msgsz = NEXTSZ(msgsz)) { double totaltime; queuetest(1, msgsz, 0); /* "warm-up" run */ barrier(); queuetest(iters, msgsz, 1); barrier(); } } } fflush(NULL); sleep(1); /* pause for output */ barrier(); if (doexchangetest) { /* Exchange (all-to-all) test */ if (rank == 0) { printf("=====> testmpiperf-exchange nprocs=%d config=MPI\n", nproc); printf("running %i iterations of exchange test per size\n", iters); fflush(stdout); } barrier(); { int msgsz; for (msgsz = FIRSTSZ(); !DONESZ(msgsz*nproc); msgsz = NEXTSZ(msgsz)) { double totaltime; exchangetest(1, msgsz); /* "warm-up" run */ barrier(); totaltime = exchangetest(iters, msgsz); barrier(); printf("P%i-P%i: size=%8i bytes, inv. throughput= %9.3f us, bandwidth= %11.3f KB/sec\n", rank, peerid, msgsz, totaltime/iters, (((double)msgsz*nproc)*iters/KB)/(totaltime/1000000)); fflush(stdout); } } } barrier(); shutdownMPI(); return 0; }
void sbuf_chr(struct sbuf *sbuf, int c) { if (sbuf->s_n + 2 >= sbuf->s_sz) sbuf_extend(sbuf, NEXTSZ(sbuf->s_sz, 1)); sbuf->s[sbuf->s_n++] = c; }