#define _GNU_SOURCE #include #include #include #include #include #include int main (int argc, char * argv[]) { int nomp = omp_get_max_threads (); int nmess = 1000; int lrank; int nrank; int buf_len = 100000000; char * buf; FILE * fp; char f[256]; int thread_level; //MPI_Init (&argc, &argv); MPI_Init_thread (&argc, &argv, MPI_THREAD_MULTIPLE, &thread_level); fprintf (stderr, " MPI_THREAD_SINGLE = %d\n", MPI_THREAD_SINGLE); fprintf (stderr, " MPI_THREAD_FUNNELED = %d\n", MPI_THREAD_FUNNELED); fprintf (stderr, " MPI_THREAD_SERIALIZED = %d\n", MPI_THREAD_SERIALIZED); fprintf (stderr, " MPI_THREAD_MULTIPLE = %d\n", MPI_THREAD_MULTIPLE); fprintf (stderr, " thread_level = %d\n", thread_level); MPI_Comm_rank (MPI_COMM_WORLD, &lrank); MPI_Comm_size (MPI_COMM_WORLD, &nrank); buf = (char *)malloc (buf_len); MPI_Buffer_attach (buf, buf_len); sprintf (f, "mpitest.%6.6d.txt", lrank); fp = fopen (f, "w"); #pragma omp parallel { int bsend[2]; int isend; int isend1, isend2; int irank; int iomp = omp_get_thread_num (); bsend[0] = lrank; bsend[1] = iomp; isend1 = (nmess * (iomp+0)) / nomp; isend2 = (nmess * (iomp+1)) / nomp; for (irank = 0; irank < nrank; irank++) if (irank != lrank) for (isend = isend1; isend < isend2; isend++) { MPI_Bsend (bsend, 2, MPI_INT, irank, 0, MPI_COMM_WORLD); fprintf (fp, "S%d %d %d\n", irank, iomp, lrank); fflush (fp); } } #pragma omp parallel { MPI_Status status; int brecv[2]; int irecv; int irecv1; int irecv2; int irank; int iomp = omp_get_thread_num (); irecv1 = (nmess * (iomp+0)) / nomp; irecv2 = (nmess * (iomp+1)) / nomp; for (irank = 0; irank < nrank; irank++) if (irank != lrank) for (irecv = irecv1; irecv < irecv2; irecv++) { MPI_Recv (brecv, 2, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status); fprintf (fp, "R%d %d %d %d %d\n", status.MPI_SOURCE, iomp, lrank, brecv[0], brecv[1]); fflush (fp); } } fclose (fp); MPI_Finalize (); return 0; }