On 12/6/2010 3:16 AM, Hicham Mouline wrote:
> Hello,
>
> 1. MPI_THREAD_SINGLE: Only one thread will execute.
> Does this really mean the process cannot have any other threads at all, even if they doen't deal with MPI at all?
> I'm curious as to how this case affects the openmpi implementation?
> Essentially, what is the difference between MPI_THREAD_SINGLE and MPI_THREAD_FUNNELED?
>
> 2. In my case, I'm interested in MPI_THREAD_SERIALIZED. However if it's available, I can use MPI_THREAD_FUNNELED.
> What cmake flags do I need to enable to allow this mode?
>
> 3. Assume I assign only 1 thread in my program to deal with MPI. What is the difference between
> int MPI::Init_thread(MPI_THREAD_SINGLE)
> int MPI::Init_thread(MPI_THREAD_FUNNELED)
> int MPI::Init()
>
You're question is too broad; perhaps you didn't intend it that way.
Are you trying to do something which may work only with a specific
version of openmpi, or are you willing to adhere to portable practice?
I tend to believe what it says at
http://www.mcs.anl.gov/research/projects/mpi/mpi-standard/mpi-report-2.0/node165.htm

including:
A call to MPI_INIT has the same effect as a call to MPI_INIT_THREAD with
a required = MPI_THREAD_SINGLE

You would likely use one of those if all your MPI calls are from a
single thread, and you don't perform any threading inside MPI. MPI
implementations vary on the extent to which a higher level of threading
than what is declared can be used successfully (there's no guarantee of
bad results if you exceed what was set by MPI_INIT). There shouldn't
be any bad effect from setting a higher level of thread support which
you never use.

I would think your question about cmake flags would apply only once you
chose a compiler. I have never seen anyone try mixing
auto-parallelization with MPI; that would require MPI_THREAD_MULTIPLE
but still appears unpredictable. MPI_THREAD_FUNNELED is used often with
OpenMP parallelization inside MPI.