
Hi Hicham, On Mon, Dec 6, 2010 at 11:58 AM, Hicham Mouline <hicham@mouline.org> wrote:
(1) You must initialize MPI with MPI_Init_thread() instead of MPI_Init(). The boost::mpi::communicator ctor uses MPI_Init(), so you must run the initialization yourself and *then* create the communicator object. For instance:: MPI_Init_thread(&argc, &argv, MPI_THREAD_SERIALIZED) // ... mpi::communicator world;
I have the following code in my main:
int main(int argc, char* argv[]) { boost::mpi::environment env(argc, argv); const int mpi_thread_support = MPI::Init_thread(argc, argv, MPI_THREAD_SERIALIZED ); if (mpi_thread_support != MPI_THREAD_SERIALIZED) { std::cerr<< "MPI implementation does not support threads" <<std::endl; return 1; } boost::mpi::communicator world; ... }
This prints an error however:
Calling MPI_Init or MPI_Init_thread twice is erroneous.
How does 1 avoid that the mpi::communicator constructor calling MPI_INIT twice?
Perhaps it's the environment constructor that calls MPI_INIT?
Yes, indeed. There's a mistake in the pseudo-code I sent in my reply to Philipp: one must call MPI_Init_thread() before istanciating boost::mpi::environment. So the correct init order is: MPI_Init_thread(&argc, &argv, required, &provided); if (required > provided) { // warning: MPI impl does not support the requested threading model } mpi::environment env(argc, argv); mpi::communicator world; Thanks for the correction! Best regards, Riccardo