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;
}





Reply via email to