Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] MPI_CANCEL
From: George Bosilca (bosilca_at_[hidden])
Date: 2008-04-15 16:52:35


The MPI_Cancel is only supported for receive requests. It's a no-op
for sends. Therefore your request never get canceled and the wait will
block until the request completion ... which means it will block
forever (as there is no receive corresponding to the request).

   george.

On Apr 15, 2008, at 3:14 PM, slimtimmy_at_[hidden] wrote:
> I encountered some problems when using MPI_CANCEL. I call
> Request::Cancel followed by Request::Wait to ensure that the request
> has
> been cancelled. However Request::Wait does not return when I send
> bigger
> messages. The following code should reproduce this behaviour:
>
> #include "mpi.h"
> #include <iostream>
>
> using namespace std;
>
> enum Tags
> {
> TAG_UNMATCHED1,
> TAG_UNMATCHED2
> };
>
> int main()
> {
> MPI::Init();
>
> const int rank = MPI::COMM_WORLD.Get_rank();
> const int numProcesses = MPI::COMM_WORLD.Get_size();
> const int masterRank = 0;
>
> if (rank == masterRank)
> {
> cout << "master" << endl;
> const int numSlaves = numProcesses - 1;
> for(int i = 0; i < numSlaves; ++i)
> {
> const int slaveRank = i + 1;
> int buffer;
> MPI::COMM_WORLD.Recv(&buffer, 1, MPI::INT, slaveRank,
> TAG_UNMATCHED1);
> }
>
> }
> else
> {
> cout << "slave " << rank << endl;
> //const int size = 1;
> const int size = 10000;
> int buffer[size];
> MPI::Request request = MPI::COMM_WORLD.Isend(buffer, size,
> MPI::INT,
> masterRank, TAG_UNMATCHED2);
>
> cout << "slave ("<< rank<<"): sent data" << endl;
>
> request.Cancel();
>
> cout << "slave ("<< rank<<"): cancel issued" << endl;
>
> request.Wait();
>
> cout << "slave ("<< rank<<"): finished" << endl;
> }
>
>
> MPI::Finalize();
>
> return 0;
> }
>
>
> If I set size to 1, everything works as expected, the slave process
> finishes execution. However if I use a bigger buffer (in this case
> 10000) the wait blocks forever. That's the output of the program when
> run with two processes:
>
> master
> slave 1
> slave (1): sent data
> slave (1): cancel issued
>
>
> Have I misinterpreted the standard? Or does Request::Wait block until
> the message is delievered?
>
>
> _______________________________________________
> users mailing list
> users_at_[hidden]
> http://www.open-mpi.org/mailman/listinfo.cgi/users



  • application/pkcs7-signature attachment: smime.p7s