Hi everyone! I'm trying to use MPI on a cluster running OpenMPI 1.2.4 and starting processes through PBSPro_11.0.2.110766. I've been running into a couple of performance and deadlock problems and like to check whether I'm making a mistake.
One of the deadlocks I managed to boil down to the attached example. I run it on 8 cores. It usually deadlocks with all except one process showing start barrier as last output. The one process out of order shows: start getting local My question at this point is simply whether this is expected behaviour of OpenMPI. Thanks in advance! Ole
#include<mpi.h> #include<iostream> #include<stdlib.h> #include<fstream> #include<string> #include<sstream> #define LOG(m) \ log << (m) << std::endl; \ log.flush() #define LOG2(m1, m2) \ log << (m1) << (m2) << std::endl; \ log.flush() int main(int argc, char** argv) { MPI::Init(argc,argv); int num_procs=MPI::COMM_WORLD.Get_size(); if (num_procs<2) return 1; int rank=MPI::COMM_WORLD.Get_rank(); double* local=(double*) MPI::Alloc_mem(sizeof(double), MPI::INFO_NULL); MPI::Win win=win.Create(local, sizeof(double), sizeof(double), MPI::INFO_NULL, MPI::COMM_WORLD); std::ostringstream t; t << rank; std::string s="out."+t.str(); std::ofstream log(s.c_str(), std::ios::out); if (!log.is_open()) return 1; sleep(rank); LOG("start writing local"); win.Lock(MPI::LOCK_EXCLUSIVE, rank, 0); *local=13.37*rank; win.Unlock(rank); LOG("end writing local"); double d1=0.0; double d2=0.0; for(unsigned int i=0;i<num_procs;++i) { if (i==rank) continue; LOG2("start getting", i); win.Lock(MPI::LOCK_SHARED, i, 0); win.Get(&d1, 1, MPI::DOUBLE, i, 0, 1, MPI::DOUBLE); win.Unlock(i); LOG2("end getting", i); d2+=d1; } sleep(num_procs-rank); LOG("start getting local"); win.Lock(MPI::LOCK_EXCLUSIVE, rank, 0); d2+=*local; win.Unlock(rank); LOG("end getting local"); LOG("start barrier"); MPI::COMM_WORLD.Barrier(); LOG("end barrier"); LOG("start win.Free()"); win.Free(); LOG("end win.Free()"); LOG("start Finalize()"); MPI::Finalize(); LOG("end Finalize()"); return 0; }
pgpegt3CeZuUb.pgp
Description: PGP signature