Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |  

This web mail archive is frozen.

This page is part of a frozen web archive of this mailing list.

You can still navigate around this archive, but know that no new mails have been added to it since July of 2016.

Click here to be taken to the new web archives of this list; it includes all the mails that are in this frozen archive plus all new mails that have been sent to the list since it was migrated to the new archives.

Subject: [OMPI users] MPI_Wait: wait for ever by using Issend using larger data-strings
From: dbbmyx-franzxaver_at_[hidden]
Date: 2010-09-06 06:03:20


Hi,

first of all sorry that I write a new thread. I already wrote a messge about "Problem with the receive buffer size?". But I had some problems with my email-provider and the mailinglist. (I do not often use mailing lists).

Here is the link to my old Message: http://www.open-mpi.org/community/lists/users/2010/09/14181.php

I wrote a short programm that show my problem. (The coding ist very ugly. sorry). It send a serialized object(this time a very simple) as a string to the other process.

The problem is that it never gets return of the wait-operation when I using a more data.
If you set the countR to 996 it waits forever. With 995 it works.
Can anyone help me?

Thanks!!!

(used library: boost_serialization)
#include <mpi.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <queue>

#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

#include <boost/serialization/deque.hpp>

#define countS 1
#define countR 996

class expObj{
public:
        friend class boost::serialization::access;

   char array[countS][countR];
   template<class Archive>
        void serialize(Archive & ar, const unsigned int version){
                ar & array;
        }

        expObj(){
                for (int i = 0; i < countS; i++) {
                        for (int j = 0; j < countR; j++) {
                                array[i][j] = 'q';
                        }
                }
        }
};

int main(int argc, char* argv[])
{
  MPI_Init(&argc, &argv);

  int rank;
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  if (rank == 0) {
          MPI_Request request_bilder_token_ro_multi;

                std::deque<expObj> senden;
                expObj bild1;
                bild1.array[0][0] = 'a';
                senden.push_back(bild1);
                std::ostringstream archive_stream1;
                boost::archive::text_oarchive archive(archive_stream1);

                archive << senden;
                std::string outbound_data_ = archive_stream1.str();
                std::cout << "Send - Size of message: " << outbound_data_.size() << std::endl;

                MPI_Issend(&outbound_data_[0], static_cast<int>(outbound_data_.size()), MPI_CHAR, 1, 0, MPI_COMM_WORLD,&request_bilder_token_ro_multi);
    while(true){
            1/1;
    }
  }

  else if (rank == 1) {
          MPI_Request req;
          MPI_Status stat;
          int flag = 0; //
          int msglen = 1;

                std::deque<expObj> receive;
                expObj obj;

    std::string serString;

    do {
            MPI_Iprobe(0, 0, MPI_COMM_WORLD, &flag, &stat);
        } while (!flag);
            MPI_Get_count(&stat, MPI_CHAR, &msglen);
            std::cout <<"Received size: "<< msglen <<std::endl;
            serString.clear();
            serString.resize(msglen,'a');
            MPI_Irecv(&serString[0], msglen, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &req);
            MPI_Wait(&req,&stat);
        /*do{
                MPI_Test(&req,&flag,&stat);
        }while(flag == 0);*/
            std::cout << "Receive: <" << serString <<">"<< std::endl;
  }

  std::cout << "Rank 1 OK!" << std::endl;
  MPI_Finalize();
  return 0;
}