#include #include #include #include #include #include #include //for atoi (in case someone doesn't have boost) const int buflen=50000*24; int numprocs, rank, namelen; char processor_name[MPI_MAX_PROCESSOR_NAME]; using namespace std; class Message { public: MPI_Request req; MPI_Status status; char buffer[buflen]; int count; void reset(char val){ memset(buffer,val,sizeof(char)*buflen); } Message(): count(0) { reset(rank); } Message(int _count) : count(_count) { reset(count+rank+1); } bool preVerify(){ char content=rank; for(int b=0;b"<< bi << " = "<< (int)buffer[bi]<"<< bi << " = "<< (int)buffer[bi]<1){ //optionally specify number of repeats on the command line reps=atoi(argv[1]); } MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD, &numprocs); MPI_Comm_rank(MPI_COMM_WORLD, &rank); MPI_Get_processor_name(processor_name, &namelen); int senders=numprocs/2; int receivers=numprocs-senders; assert(senders>0); assert(receivers>0); cout << "Process "< > sendQs(receivers); vector counts(receivers,0); for(int i=0;i &sendQ=sendQs[receiver]; int target=receiver+senders; sendQ.push_back(Message(counts[receiver]++)); Message &msg=sendQ.back(); char content=msg.count+rank+1; //confirm that everything we're sending hasn't been corrupted assert(msg.buffer); // cerr << rank<< ">Starting send "<:Started send "<::iterator ite=sendQ.begin();ite!=sendQ.end();){ MPI_Test(&ite->req,&f,&ite->status); if(f){ // cerr << "Send "<count<<" to "<reset(0); list::iterator j=ite; ++ite; sendQ.erase(j); }else break; //packets should be received in order by receiver, so can stop if we hit one that hasn't been received yet } } } //wait for remaining sends to finish... int nodesLeft=0,messageCount=0; for(int receiver=0;receiver &sendQ=sendQs[receiver]; if(!sendQ.empty()){ int finished=0; int ret=MPI_Test(&sendQ.front().req,&finished,&sendQ.front().status); if(finished) sendQ.pop_front(); if(sendQ.empty()){//with this message received we've exhausted this queue nodesLeft--; // cout << "Receiver "< msgSenders(senders); for(int si=0;si=reps) continue; //done with this one //see if any messages have been received int f=0; if(1){ //use tests MPI_Test(&msg.req,&f,&msg.status); }else{ cout << "Waiting on message "<