#include #include #include #include #include #include #include #include #define COMBUFSIZE (4 * 1024 * 1024) int mpi_self; int mpi_npes; char* rbuffer; char* sbuffer; double perf_alltoall(int size, int iter) { MPI_Status status; int err; struct timeval begin, end; int sec, usec; double total; int i; int stride; char* rbuf; char* sbuf; if (size * mpi_npes > COMBUFSIZE) { rbuf = (char*) valloc(size * mpi_npes); bzero(rbuf, size * mpi_npes); } else { rbuf = rbuffer; } if (size * mpi_npes > COMBUFSIZE / 2) { sbuf = (char*) valloc(size * mpi_npes); bzero(sbuf, size * mpi_npes); stride = 0; } else { sbuf = sbuffer; stride = (size * mpi_npes + 32) & ~31; } MPI_Barrier(MPI_COMM_WORLD); gettimeofday(&begin, 0); for (i = 0; i < iter; i++) { /*************************/ /* do something when size*/ /*************************/ MPI_Alltoall(sbuf, size, MPI_BYTE, rbuf, size, MPI_BYTE, MPI_COMM_WORLD); /*************************/ sbuf += stride; if (stride > 0 && sbuf > sbuffer + COMBUFSIZE - size * mpi_npes) { sbuf = sbuffer; } MPI_Barrier(MPI_COMM_WORLD); } gettimeofday(&end, 0); sec = end.tv_sec - begin.tv_sec; usec = end.tv_usec - begin.tv_usec; if (usec < 0) { usec += 1000000; sec--; } total = sec * 1000000 + usec; return total / (double)iter; } int main (int argc, char *argv[]) { int size, iter; int err; double time; MPI_Init (&argc, &argv); MPI_Comm_rank (MPI_COMM_WORLD, &mpi_self); MPI_Comm_size (MPI_COMM_WORLD, &mpi_npes); rbuffer = (char*)valloc(COMBUFSIZE); sbuffer = (char*)valloc(COMBUFSIZE); bzero(rbuffer, COMBUFSIZE); bzero(sbuffer, COMBUFSIZE); MPI_Barrier(MPI_COMM_WORLD); if (argc >= 3) { size = atoi(argv[1]); iter = atoi(argv[2]); } else { size = 16384; iter = 100; } if (mpi_self == 0) { time = perf_alltoall(size, iter); } else { perf_alltoall(size, iter); } if (mpi_self == 0) { printf("%d\t%d\t%f\n", mpi_npes, size, time); } MPI_Finalize(); return 0; }