SlideShare a Scribd company logo
1 of 39
Always MPI_TEST or
MPI_WAIT
Jeff Squyres
The MPI Guy
December 2012
void sender(void) {      void receiver(void) {
  MPI_Request request;     int ack;
  int ack;                 /* … */
  /* … */                  MPI_Recv(buffer, …);
  MPI_Isend(buffer, …,     MPI_Send(&ack, …);
         &request);      }
  MPI_Recv(&ack, …);
}
void sender(void) {      void receiver(void) {
  MPI_Request request;     int ack;
  int ack;                 /* … */
  /* … */                  MPI_Recv(buffer, …);
  MPI_Isend(buffer, …,     MPI_Send(&ack, …);
         &request);      }
  MPI_Recv(&ack, …);
}
void sender(void) {                      void receiver(void) {
  MPI_Request request;                     int ack;
  int ack;                                 /* … */
  /* … */                                  MPI_Recv(buffer, …);
  MPI_Isend(buffer, …,                     MPI_Send(&ack, …);
         &request);                      }
  MPI_Recv(&ack, …);
}

                   Must (eventually) use an MPI TEST or WAIT operation
                   on the pending request, even if you “know” that it
                   has already completed
But

WHY?
A. Because MPI says so.
But I don’t   WANT TO!
A. Because MPI says so.




Don’t fight the Law, son.
The Law will always win.
B. Because you’ll leak resources
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
                                          isend_request

                MPI allocates a request
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
                                          isend_request

                MPI allocates a request
                MPI performs the send
Consider what happens
               when you Isend…

                                                     resources
MPI_Isend(buffer, …, &request);
                                                   isend_request

                MPI allocates a request
                MPI performs the send
                …which may include allocating additional resources
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
                                                   isend_request
                                                      resources
                MPI allocates a request
                MPI performs the send
                …which may include allocating additional resources
                Those resources are attached to the request
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
                                           isend_request
                                            resources
                The send eventually done
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
                                                 isend_request
                                                  resources
                The send eventually finishes
                The request is marked complete
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
                                         isend_request
                                          resources
                …but it’s still there!
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
                                          isend_request
                                           resources
                …but it’s still there!
                Eating valuable memory!
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
                                                     isend_request
                                                        resources
                …but it’s still there!
                Eating valuable memory!
                And possibly still holding on to valuable resources!
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
MPI_Wait(&request, …);                     isend_request
                                            resources
                …until you invoke a TEST
                or WAIT operation that
                completes the request
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
MPI_Wait(&request, …);

                                            resources
                Then the request is freed
Consider what happens
               when you Isend…

MPI_Isend(buffer, …, &request);
MPI_Wait(&request, …);

                Then the request is freed
                …including any resources that
                weren’t previously released
Does it really

MATTER?
Individual MPI_Requests
One tiny
request          may be small
Particularly compared to
One tiny
request    how much RAM is available




           All of RAM
…but every MPI process
  is making requests




All of RAM
…and they might be making
   LOTS of requests




All of RAM
You might fill RAM slowly
  …but you’ll still fill it




All of RAM
Worse: hardware resources might not
be released until the request is complete

                                isend_request
              Remember these?     resources
Meaning: it’s not just abundant
 RAM that you’re consuming


                           resources
Communication hardware = expensive
Therefore, far less resources available
   resources   resources   resources   resources

   resources   resources   resources   resources

   resources   resources   resources   resources

   resources   resources   resources   resources

   resources   resources   resources   resources

   resources   resources   resources   resources

   resources   resources   resources   resources
Compare: RAM vs.
communication hardware resources




All of RAM
Compare: RAM vs.
communication hardware resources

   Wasting this may be forgivable




All of RAM
Compare: RAM vs.
communication hardware resources

   Wasting this may be forgivable


                                    Wasting this is


All of RAM                          a terrible idea
void sender(void) {        void receiver(void) {
  MPI_Request request;       int ack;
  int ack;                   /* … */
  /* … */                    MPI_Recv(buffer, …);
  MPI_Isend(buffer, …,       MPI_Send(&ack, …);
         &request);        }
  MPI_Recv(&ack, …);
  MPI_Wait(&request, …);
}
void sender(void) {                       void receiver(void) {
  MPI_Request request;                      int ack;
  int ack;                                  /* … */
  /* … */                                   MPI_Recv(buffer, …);
  MPI_Isend(buffer, …,                      MPI_Send(&ack, …);
         &request);                       }
  MPI_Recv(&ack, …);
  MPI_Wait(&request, …);
}

                   If you “know” the send is already complete, the WAIT
                   will likely be fast
Friends don’t let friends
leak MPI_Requests
Thank you.

More Related Content

More from Jeff Squyres

MPI Fourm SC'15 BOF
MPI Fourm SC'15 BOFMPI Fourm SC'15 BOF
MPI Fourm SC'15 BOFJeff Squyres
 
Open MPI SC'15 State of the Union BOF
Open MPI SC'15 State of the Union BOFOpen MPI SC'15 State of the Union BOF
Open MPI SC'15 State of the Union BOFJeff Squyres
 
Cisco's journey from Verbs to Libfabric
Cisco's journey from Verbs to LibfabricCisco's journey from Verbs to Libfabric
Cisco's journey from Verbs to LibfabricJeff Squyres
 
(Very) Loose proposal to revamp MPI_INIT and MPI_FINALIZE
(Very) Loose proposal to revamp MPI_INIT and MPI_FINALIZE(Very) Loose proposal to revamp MPI_INIT and MPI_FINALIZE
(Very) Loose proposal to revamp MPI_INIT and MPI_FINALIZEJeff Squyres
 
Fun with Github webhooks: verifying Signed-off-by
Fun with Github webhooks: verifying Signed-off-byFun with Github webhooks: verifying Signed-off-by
Fun with Github webhooks: verifying Signed-off-byJeff Squyres
 
Open MPI new version number scheme and roadmap
Open MPI new version number scheme and roadmapOpen MPI new version number scheme and roadmap
Open MPI new version number scheme and roadmapJeff Squyres
 
The State of libfabric in Open MPI
The State of libfabric in Open MPIThe State of libfabric in Open MPI
The State of libfabric in Open MPIJeff Squyres
 
Cisco usNIC libfabric provider
Cisco usNIC libfabric providerCisco usNIC libfabric provider
Cisco usNIC libfabric providerJeff Squyres
 
2014 01-21-mpi-community-feedback
2014 01-21-mpi-community-feedback2014 01-21-mpi-community-feedback
2014 01-21-mpi-community-feedbackJeff Squyres
 
(Open) MPI, Parallel Computing, Life, the Universe, and Everything
(Open) MPI, Parallel Computing, Life, the Universe, and Everything(Open) MPI, Parallel Computing, Life, the Universe, and Everything
(Open) MPI, Parallel Computing, Life, the Universe, and EverythingJeff Squyres
 
Cisco usNIC: how it works, how it is used in Open MPI
Cisco usNIC: how it works, how it is used in Open MPICisco usNIC: how it works, how it is used in Open MPI
Cisco usNIC: how it works, how it is used in Open MPIJeff Squyres
 
Cisco EuroMPI'13 vendor session presentation
Cisco EuroMPI'13 vendor session presentationCisco EuroMPI'13 vendor session presentation
Cisco EuroMPI'13 vendor session presentationJeff Squyres
 
Open MPI Explorations in Process Affinity (EuroMPI'13 presentation)
Open MPI Explorations in Process Affinity (EuroMPI'13 presentation)Open MPI Explorations in Process Affinity (EuroMPI'13 presentation)
Open MPI Explorations in Process Affinity (EuroMPI'13 presentation)Jeff Squyres
 
MOSSCon 2013, Cisco Open Source talk
MOSSCon 2013, Cisco Open Source talkMOSSCon 2013, Cisco Open Source talk
MOSSCon 2013, Cisco Open Source talkJeff Squyres
 
Ethernet and TCP optimizations
Ethernet and TCP optimizationsEthernet and TCP optimizations
Ethernet and TCP optimizationsJeff Squyres
 
MPI-3 Timer requests proposal
MPI-3 Timer requests proposalMPI-3 Timer requests proposal
MPI-3 Timer requests proposalJeff Squyres
 
MPI_Mprobe is good for you
MPI_Mprobe is good for youMPI_Mprobe is good for you
MPI_Mprobe is good for youJeff Squyres
 
The Message Passing Interface (MPI) in Layman's Terms
The Message Passing Interface (MPI) in Layman's TermsThe Message Passing Interface (MPI) in Layman's Terms
The Message Passing Interface (MPI) in Layman's TermsJeff Squyres
 
What is [Open] MPI?
What is [Open] MPI?What is [Open] MPI?
What is [Open] MPI?Jeff Squyres
 

More from Jeff Squyres (20)

MPI Fourm SC'15 BOF
MPI Fourm SC'15 BOFMPI Fourm SC'15 BOF
MPI Fourm SC'15 BOF
 
Open MPI SC'15 State of the Union BOF
Open MPI SC'15 State of the Union BOFOpen MPI SC'15 State of the Union BOF
Open MPI SC'15 State of the Union BOF
 
Cisco's journey from Verbs to Libfabric
Cisco's journey from Verbs to LibfabricCisco's journey from Verbs to Libfabric
Cisco's journey from Verbs to Libfabric
 
(Very) Loose proposal to revamp MPI_INIT and MPI_FINALIZE
(Very) Loose proposal to revamp MPI_INIT and MPI_FINALIZE(Very) Loose proposal to revamp MPI_INIT and MPI_FINALIZE
(Very) Loose proposal to revamp MPI_INIT and MPI_FINALIZE
 
Fun with Github webhooks: verifying Signed-off-by
Fun with Github webhooks: verifying Signed-off-byFun with Github webhooks: verifying Signed-off-by
Fun with Github webhooks: verifying Signed-off-by
 
Open MPI new version number scheme and roadmap
Open MPI new version number scheme and roadmapOpen MPI new version number scheme and roadmap
Open MPI new version number scheme and roadmap
 
The State of libfabric in Open MPI
The State of libfabric in Open MPIThe State of libfabric in Open MPI
The State of libfabric in Open MPI
 
Cisco usNIC libfabric provider
Cisco usNIC libfabric providerCisco usNIC libfabric provider
Cisco usNIC libfabric provider
 
2014 01-21-mpi-community-feedback
2014 01-21-mpi-community-feedback2014 01-21-mpi-community-feedback
2014 01-21-mpi-community-feedback
 
(Open) MPI, Parallel Computing, Life, the Universe, and Everything
(Open) MPI, Parallel Computing, Life, the Universe, and Everything(Open) MPI, Parallel Computing, Life, the Universe, and Everything
(Open) MPI, Parallel Computing, Life, the Universe, and Everything
 
Cisco usNIC: how it works, how it is used in Open MPI
Cisco usNIC: how it works, how it is used in Open MPICisco usNIC: how it works, how it is used in Open MPI
Cisco usNIC: how it works, how it is used in Open MPI
 
Cisco EuroMPI'13 vendor session presentation
Cisco EuroMPI'13 vendor session presentationCisco EuroMPI'13 vendor session presentation
Cisco EuroMPI'13 vendor session presentation
 
Open MPI Explorations in Process Affinity (EuroMPI'13 presentation)
Open MPI Explorations in Process Affinity (EuroMPI'13 presentation)Open MPI Explorations in Process Affinity (EuroMPI'13 presentation)
Open MPI Explorations in Process Affinity (EuroMPI'13 presentation)
 
MPI History
MPI HistoryMPI History
MPI History
 
MOSSCon 2013, Cisco Open Source talk
MOSSCon 2013, Cisco Open Source talkMOSSCon 2013, Cisco Open Source talk
MOSSCon 2013, Cisco Open Source talk
 
Ethernet and TCP optimizations
Ethernet and TCP optimizationsEthernet and TCP optimizations
Ethernet and TCP optimizations
 
MPI-3 Timer requests proposal
MPI-3 Timer requests proposalMPI-3 Timer requests proposal
MPI-3 Timer requests proposal
 
MPI_Mprobe is good for you
MPI_Mprobe is good for youMPI_Mprobe is good for you
MPI_Mprobe is good for you
 
The Message Passing Interface (MPI) in Layman's Terms
The Message Passing Interface (MPI) in Layman's TermsThe Message Passing Interface (MPI) in Layman's Terms
The Message Passing Interface (MPI) in Layman's Terms
 
What is [Open] MPI?
What is [Open] MPI?What is [Open] MPI?
What is [Open] MPI?
 

Friends don't let friends leak MPI_Requests

  • 1. Always MPI_TEST or MPI_WAIT Jeff Squyres The MPI Guy December 2012
  • 2. void sender(void) { void receiver(void) { MPI_Request request; int ack; int ack; /* … */ /* … */ MPI_Recv(buffer, …); MPI_Isend(buffer, …, MPI_Send(&ack, …); &request); } MPI_Recv(&ack, …); }
  • 3. void sender(void) { void receiver(void) { MPI_Request request; int ack; int ack; /* … */ /* … */ MPI_Recv(buffer, …); MPI_Isend(buffer, …, MPI_Send(&ack, …); &request); } MPI_Recv(&ack, …); }
  • 4. void sender(void) { void receiver(void) { MPI_Request request; int ack; int ack; /* … */ /* … */ MPI_Recv(buffer, …); MPI_Isend(buffer, …, MPI_Send(&ack, …); &request); } MPI_Recv(&ack, …); } Must (eventually) use an MPI TEST or WAIT operation on the pending request, even if you “know” that it has already completed
  • 6. A. Because MPI says so.
  • 7. But I don’t WANT TO!
  • 8. A. Because MPI says so. Don’t fight the Law, son. The Law will always win.
  • 9. B. Because you’ll leak resources
  • 10. Consider what happens when you Isend… MPI_Isend(buffer, …, &request);
  • 11. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); isend_request MPI allocates a request
  • 12. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); isend_request MPI allocates a request MPI performs the send
  • 13. Consider what happens when you Isend… resources MPI_Isend(buffer, …, &request); isend_request MPI allocates a request MPI performs the send …which may include allocating additional resources
  • 14. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); isend_request resources MPI allocates a request MPI performs the send …which may include allocating additional resources Those resources are attached to the request
  • 15. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); isend_request resources The send eventually done
  • 16. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); isend_request resources The send eventually finishes The request is marked complete
  • 17. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); isend_request resources …but it’s still there!
  • 18. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); isend_request resources …but it’s still there! Eating valuable memory!
  • 19. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); isend_request resources …but it’s still there! Eating valuable memory! And possibly still holding on to valuable resources!
  • 20. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); MPI_Wait(&request, …); isend_request resources …until you invoke a TEST or WAIT operation that completes the request
  • 21. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); MPI_Wait(&request, …); resources Then the request is freed
  • 22. Consider what happens when you Isend… MPI_Isend(buffer, …, &request); MPI_Wait(&request, …); Then the request is freed …including any resources that weren’t previously released
  • 24.
  • 26. Particularly compared to One tiny request how much RAM is available All of RAM
  • 27. …but every MPI process is making requests All of RAM
  • 28. …and they might be making LOTS of requests All of RAM
  • 29. You might fill RAM slowly …but you’ll still fill it All of RAM
  • 30. Worse: hardware resources might not be released until the request is complete isend_request Remember these? resources
  • 31. Meaning: it’s not just abundant RAM that you’re consuming resources
  • 32. Communication hardware = expensive Therefore, far less resources available resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources resources
  • 33. Compare: RAM vs. communication hardware resources All of RAM
  • 34. Compare: RAM vs. communication hardware resources Wasting this may be forgivable All of RAM
  • 35. Compare: RAM vs. communication hardware resources Wasting this may be forgivable Wasting this is All of RAM a terrible idea
  • 36. void sender(void) { void receiver(void) { MPI_Request request; int ack; int ack; /* … */ /* … */ MPI_Recv(buffer, …); MPI_Isend(buffer, …, MPI_Send(&ack, …); &request); } MPI_Recv(&ack, …); MPI_Wait(&request, …); }
  • 37. void sender(void) { void receiver(void) { MPI_Request request; int ack; int ack; /* … */ /* … */ MPI_Recv(buffer, …); MPI_Isend(buffer, …, MPI_Send(&ack, …); &request); } MPI_Recv(&ack, …); MPI_Wait(&request, …); } If you “know” the send is already complete, the WAIT will likely be fast
  • 38. Friends don’t let friends leak MPI_Requests