AMPI/CUDA: Synchronous and asynchronous invocation, some cleanup
authorPhil Miller <mille121@illinois.edu>
Mon, 17 May 2010 22:04:07 +0000 (17:04 -0500)
committerPhil Miller <mille121@illinois.edu>
Mon, 24 May 2010 20:57:37 +0000 (15:57 -0500)
- Add a synchronous variant of the work request function
- Remove the MPI_Comm argument to the functions, and just use MPI_COMM_SELF internally
- Clean up comments and other nits

examples/ampi/cuda/simple/simple.c
src/libs/ck-libs/ampi/ampi.C
src/libs/ck-libs/ampi/ampi.h
src/libs/ck-libs/ampi/ampiimpl.h

index fe31782eea6e3b19e80abfe253ba2d632e26fac0..a115a5ee06a6a60f5fc63438c55cbe96812dc8f4 100644 (file)
@@ -8,7 +8,7 @@ int main(int argc, char **argv)
     MPI_Request req;
     MPI_Status sts;
     void *wr = kernelSetup();
-    AMPI_GPU_invoke(wr, MPI_COMM_WORLD, &req);
+    AMPI_GPU_Iinvoke(wr, &req);
     MPI_Wait(&req, &sts);
 
     MPI_Finalize();
index 3334c69dc989cdf1fe355323aa365148c4e50be8..bdb7882d1d20a6cda32bcb950b89fac22700371b 100644 (file)
@@ -5725,13 +5725,13 @@ int AMPI_System(const char *cmd) {
 }
 
 #if CMK_CUDA
-GPUReq::GPUReq(int comm_)
+GPUReq::GPUReq()
 {
-    MPI_Comm_rank(comm_, &src);
-    comm = comm_;
+    comm = MPI_COMM_SELF;
+    isComplete = false;
     isvalid = true;
+    MPI_Comm_rank(comm, &src);
     buf = getAmpiInstance(comm);
-    isComplete = false;
 }
 
 bool GPUReq::test(MPI_Status *sts)
@@ -5777,21 +5777,33 @@ void AMPI_GPU_complete(void *request, void* dummy)
 }
 
 CDECL
-int AMPI_GPU_invoke(workRequest *to_call, MPI_Comm comm, MPI_Request *request)
+int AMPI_GPU_Iinvoke(workRequest *to_call, MPI_Request *request)
 {
     AMPIAPI(__func__);
 
     AmpiRequestList* reqs = getReqs();
-    GPUReq *newreq = new GPUReq(comm);
+    GPUReq *newreq = new GPUReq();
     *request = reqs->insert(newreq);
 
-    // Create a callback that completes the corresponding request
+    // A callback that completes the corresponding request
     CkCallback *cb = new CkCallback(&AMPI_GPU_complete, newreq);
     setWRCallback(to_call, cb);
 
-    // Call the CUDA manager with to_call and cb
     enqueue(wrQueue, to_call);
 }
+
+CDECL
+int AMPI_GPU_Invoke(workRequest *to_call)
+{
+    AMPIAPI(__func__);
+
+    MPI_Request req;
+    AMPI_GPU_Iinvoke(to_call, &req);
+    MPI_Wait(&req, MPI_STATUS_IGNORE);
+
+    return 0;
+}
+
 #endif
 
 #include "ampi.def.h"
index 702ba599cca83f166b1bc11f3dc53e7ab8e3d7ef..ccb40ca571203ab17f2eb6e137521b10ba2d30aa 100644 (file)
@@ -654,7 +654,8 @@ int AMPI_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addr
 typedef struct workRequest workRequest;
 
 /* AMPI GPU Request interface */
-int AMPI_GPU_invoke(workRequest *to_call, MPI_Comm comm, MPI_Request *request);
+int AMPI_GPU_Iinvoke(workRequest *to_call, MPI_Request *request);
+int AMPI_GPU_Invoke(workRequest *to_call);
 #endif
 
 /*********************One sided communication routines *****************/ 
index 00762eb42f2b33ce6fc7a0b06159ad6beb501b8a..caec0dd7ca2807dcabaac9c16dcae971a8a35dbf 100644 (file)
@@ -750,7 +750,7 @@ class GPUReq : public AmpiRequest {
     bool isComplete;
 
 public:
-    GPUReq(int comm_);
+    GPUReq();
     int getType() { return 5; }
     CmiBool test(MPI_Status *sts);
     void complete(MPI_Status *sts);