Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
mpi example with several combinations of point-to-point message-passing functions
authorschnorr <schnorr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 10 Aug 2010 11:32:27 +0000 (11:32 +0000)
committerschnorr <schnorr@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Tue, 10 Aug 2010 11:32:27 +0000 (11:32 +0000)
details:
- this example serves as stress test to the smpi instrumentation

git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@8148 48e7efb5-ca39-0410-a469-dd3cf9ba447f

examples/smpi/CMakeLists.txt
examples/smpi/smpi_traced.c [new file with mode: 0644]

index 0d115bc..cd2fa0d 100644 (file)
@@ -25,6 +25,7 @@ add_executable(reduce reduce.c)
 add_executable(split split.c)
 add_executable(mvmul mvmul.c)
 add_executable(smpi_sendrecv sendrecv.c)
 add_executable(split split.c)
 add_executable(mvmul mvmul.c)
 add_executable(smpi_sendrecv sendrecv.c)
+add_executable(smpi_traced smpi_traced.c)
 
 target_link_libraries(alltoall2 m simgrid smpi )
 target_link_libraries(alltoall_basic m simgrid smpi )
 
 target_link_libraries(alltoall2 m simgrid smpi )
 target_link_libraries(alltoall_basic m simgrid smpi )
@@ -43,6 +44,7 @@ target_link_libraries(reduce m simgrid smpi )
 target_link_libraries(split m simgrid smpi )
 target_link_libraries(mvmul m simgrid smpi )
 target_link_libraries(smpi_sendrecv m simgrid smpi )
 target_link_libraries(split m simgrid smpi )
 target_link_libraries(mvmul m simgrid smpi )
 target_link_libraries(smpi_sendrecv m simgrid smpi )
+target_link_libraries(smpi_traced m simgrid smpi )
 
 add_custom_command(TARGET smpi_sendrecv
   POST_BUILD
 
 add_custom_command(TARGET smpi_sendrecv
   POST_BUILD
diff --git a/examples/smpi/smpi_traced.c b/examples/smpi/smpi_traced.c
new file mode 100644 (file)
index 0000000..3fa968f
--- /dev/null
@@ -0,0 +1,295 @@
+/* Copyright (c) 2009, 2010. The SimGrid Team.
+ * All rights reserved.                                                     */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#include "mpi.h"
+#include <stdio.h>
+
+int main(int argc, char *argv[])
+{
+  int rank, numprocs, i;
+
+  MPI_Init(&argc,&argv);
+  MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
+  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+
+  //Tests: 
+  //A: 0(isend -> wait) with 1(recv)
+  int A = 1;
+  //B: 0(send) with 1(irecv -> wait)
+  int B = 1;
+  //C: 0(N * isend -> N * wait) with 1(N * recv)
+  int C = 1;
+  //D: 0(N * isend -> N * waitany) with 1(N * recv)
+  int D = 1;
+  //E: 0(N*send) with 1(N*irecv, N*wait)
+  int E = 1;
+  //F: 0(N*send) with 1(N*irecv, N*waitany)
+  int F = 1;
+  //G: 0(N* isend -> waitall) with 1(N*recv)
+  int G = 1;
+  //H: 0(N*send) with 1(N*irecv, waitall)
+  int H = 1;
+  //I: 0(2*N*send, 2*N*Irecv, Waitall) with
+  //   1(N*irecv, waitall, N*isend, N*waitany) with 
+  //   2(N*irecv, N*waitany, N*isend, waitall)
+  int I = 1;
+  //J: 0(N*isend, N*test, N*wait) with (N*irecv, N*test, N*wait)
+  int J = 1;
+
+  int N = 13;
+
+  int tag = 12345;
+/////////////////////////////////////////
+////////////////// RANK 0
+///////////////////////////////////
+  if (rank == 0){
+    MPI_Request request;
+    MPI_Status status;
+    MPI_Request req[2*N];
+    MPI_Status sta[2*N];
+    int r;
+    if (A){
+      MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &request);
+      MPI_Wait (&request, &status);
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (B){
+      MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (C){
+      for (i = 0; i < N; i++){
+        MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      for (i = 0; i < N; i++){
+        MPI_Wait (&req[i], &sta[i]);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (D){
+      for (i = 0; i < N; i++){
+        MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      for (i = 0; i < N; i++){
+        int completed;
+        MPI_Waitany (N, req, &completed, sta);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (E){
+      for (i = 0; i < N; i++){
+        MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (F){
+      for (i = 0; i < N; i++){
+        MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (G){
+      for (i = 0; i < N; i++){
+        MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      MPI_Waitall (N, req, sta);
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (H){
+      for (i = 0; i < N; i++){
+        MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (I){
+      for (i = 0; i < 2*N; i++){
+        if (i < N){
+          MPI_Send(&rank, 1, MPI_INT, 2, tag, MPI_COMM_WORLD);
+        }else{
+          MPI_Send(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD);
+        }
+      }
+      MPI_Barrier (MPI_COMM_WORLD);
+      for (i = 0; i < 2*N; i++){
+        if (i < N){
+          MPI_Irecv(&r, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
+        }else{
+          MPI_Irecv(&r, 1, MPI_INT, 2, tag, MPI_COMM_WORLD, &req[i]);
+        }
+      }
+      MPI_Waitall (2*N, req, sta);
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (J){
+      for (i = 0; i < N; i++){
+        MPI_Isend(&rank, 1, MPI_INT, 1, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      for (i = 0; i < N; i++){
+        int flag;
+        MPI_Test (&req[i], &flag, &sta[i]);
+      }
+      for (i = 0; i < N; i++){
+        MPI_Wait (&req[i], &sta[i]);
+      }
+    }
+
+/////////////////////////////////////////
+////////////////// RANK 1
+///////////////////////////////////
+  }else if (rank == 1){
+    MPI_Request request;
+    MPI_Status status;
+    MPI_Request req[N];
+    MPI_Status sta[N];
+    int r;
+
+    if (A){
+      MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &status);
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (B){
+      MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &request);
+      MPI_Wait (&request, &status);
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (C){
+      for (i = 0; i < N; i++){
+        MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (D){
+      for (i = 0; i < N; i++){
+        MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (E){
+      for (i = 0; i < N; i++){
+        MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      for (i = 0; i < N; i++){
+        MPI_Wait (&req[i], &sta[i]);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (F){
+      for (i = 0; i < N; i++){
+        MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      for (i = 0; i < N; i++){
+        int completed;
+        MPI_Waitany (N, req, &completed, sta);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (G){
+      for (i = 0; i < N; i++){
+        MPI_Recv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &sta[i]);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (H){
+      for (i = 0; i < N; i++){
+        MPI_Irecv(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      MPI_Waitall (N, req, sta);
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (I){
+      for (i = 0; i < N; i++){
+        MPI_Irecv(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      MPI_Waitall (N, req, sta);
+
+      MPI_Barrier (MPI_COMM_WORLD);
+      for (i = 0; i < N; i++){
+        MPI_Isend(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      MPI_Waitall (N, req, sta);
+//      for (i = 0; i < N; i++){
+//        MPI_Wait (&req[i], &sta[i]);
+//      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+
+    if (J){
+      for (i = 0; i < N; i++){
+        MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      for (i = 0; i < N; i++){
+        int flag;
+        MPI_Test (&req[i], &flag, &sta[i]);
+      }
+      for (i = 0; i < N; i++){
+        MPI_Wait (&req[i], &sta[i]);
+      }
+    }
+
+/////////////////////////////////////////
+////////////////// RANK 2
+///////////////////////////////////
+  }else if (rank == 2){
+//    MPI_Request request;
+//    MPI_Status status;
+    MPI_Request req[N];
+    MPI_Status sta[N];
+    int r;
+
+    if (A) {} 
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (B) {} 
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (C) {} 
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (D) {} 
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (E) {} 
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (F) {} 
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (G) {} 
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (H) {} 
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (I){
+      for (i = 0; i < N; i++){
+        MPI_Irecv(&r, 1, MPI_INT, 0, tag, MPI_COMM_WORLD, &req[i]);
+      }
+      for (i = 0; i < N; i++){
+        int completed;
+        MPI_Waitany (N, req, &completed, sta);
+      }
+      MPI_Barrier (MPI_COMM_WORLD);
+
+      for (i = 0; i < N; i++){
+        MPI_Send(&rank, 1, MPI_INT, 0, tag, MPI_COMM_WORLD);
+      }
+    }
+    MPI_Barrier (MPI_COMM_WORLD);
+    if (J){}
+  }
+  MPI_Barrier (MPI_COMM_WORLD);
+  MPI_Finalize();
+  return 0;
+}