Hi Open MPI developers,

Though Sylvain's original mail (*1) was sent 4 months ago and nobody
replied to it, I'm interested in this issue and strongly agree with
Sylvain.

 *1 http://www.open-mpi.org/community/lists/devel/2010/01/7275.php

As explained by Sylvain, current Open MPI implementation always returns
MPI_THREAD_SINGLE as provided thread level if neither --enable-mpi-threads
nor --enable-progress-threads was specified at configure (v1.4).

If we use OpenMP with MPI, we need at least MPI_THREAD_FUNNELED even
if MPI functions are called only outside of omp parallel region,
like below.

    #pragma omp parallel for
    for (...) {
        /* computation */
    }
    MPI_Allreduce(...);
    #pragma omp parallel for
    for (...) {
        /* computation */
    }

This means Open MPI users must specify --enable-mpi-threads or
--enable-progress-threads to use OpenMP. Is it true?
But this two configure options, i.e. OMPI_HAVE_THREAD_SUPPORT macro,
lead to performance penalty by mutex lock/unlock.

# I know that we can actually use OpenMP with MPI_THREAD_SINGLE.
# I'm talking about reason why Open MPI returns MPI_THREAD_SINGLE.

I believe OMPI_HAVE_THREADS (not OMPI_HAVE_THREAD_SUPPORT !) is sufficient
to support MPI_THREAD_FUNNELED and MPI_THREAD_SERIALIZED, and therefore
OMPI_HAVE_THREAD_SUPPORT should be OMPI_HAVE_THREADS at following
part in ompi_mpi_init function, as suggested by Sylvain.

    ompi_mpi_thread_requested = requested;
    if (OMPI_HAVE_THREAD_SUPPORT == 0) { /* <- should be OMPI_HAVE_THREADS ? */
        ompi_mpi_thread_provided = *provided = MPI_THREAD_SINGLE;
        ompi_mpi_main_thread = NULL;
    } else if (OMPI_ENABLE_MPI_THREADS == 1) {
        ompi_mpi_thread_provided = *provided = requested;
        ompi_mpi_main_thread = opal_thread_get_self();
    } else {
        if (MPI_THREAD_MULTIPLE == requested) {
            ompi_mpi_thread_provided = *provided = MPI_THREAD_SERIALIZED;
        } else {
            ompi_mpi_thread_provided = *provided = requested;
        }
        ompi_mpi_main_thread = opal_thread_get_self();
    }

If not, what is the problem to support MPI_THREAD_FUNNELED and
MPI_THREAD_SERIALIZED without OMPI_HAVE_THREAD_SUPPORT?

Though options and code above are those of v1.4, trunk seems to same.
MPI_THREAD_MULTIPLE needs --enable-opal-multi-threads or
--enable-mpi-thread-multiple and they lead to performance penalty.

Regards,
Kawashima

> Hi list,
> 
> I'm currently playing with thread levels in Open MPI and I'm quite 
> surprised by the current code.
> 
> First, the C interface :
> at ompi/mpi/c/init_thread.c:56 we have :
> #if OPAL_ENABLE_MPI_THREADS
>      *provided = MPI_THREAD_MULTIPLE;
> #else
>      *provided = MPI_THREAD_SINGLE;
> #endif
> prior to the call to ompi_mpi_init() which will in turn override the 
> "provided" value. Should we remove these 5 lines ?
> 
> Then at ompi/runtime/ompi_mpi_init.c:372, we have -I guess- the real code 
> which is :
> 
>      ompi_mpi_thread_requested = requested;
>      if (OPAL_HAVE_THREAD_SUPPORT == 0) {
>          ompi_mpi_thread_provided = *provided = MPI_THREAD_SINGLE;
>          ompi_mpi_main_thread = NULL;
>      } else if (OPAL_ENABLE_MPI_THREADS == 1) {
>          ompi_mpi_thread_provided = *provided = requested;
>          ompi_mpi_main_thread = opal_thread_get_self();
>      } else {
>          if (MPI_THREAD_MULTIPLE == requested) {
>              ompi_mpi_thread_provided = *provided = MPI_THREAD_SERIALIZED;
>          } else {
>              ompi_mpi_thread_provided = *provided = requested;
>          }
>          ompi_mpi_main_thread = opal_thread_get_self();
>      }
> 
> This code seems ok to me provided that :
>   * (OPAL_ENABLE_MPI_THREADS == 1) means "Open MPI configured to provide 
> thread multiple",
>   * (OPAL_HAVE_THREAD_SUPPORT == 0) means "we do not have threads at all" 
> though even if we do not have threads at compile time, it does in no way 
> prevent us from doing THREAD_FUNNELED or THREAD_SERIALIZED.
> 
> The reality seems different at opal/include/opal_config_bottom.h:70 :
> 
> /* Do we have posix or solaris thread lib */
> #define OPAL_HAVE_THREADS (OPAL_HAVE_POSIX_THREADS || 
> OPAL_HAVE_SOLARIS_THREADS)
> /* Do we have thread support? */
> #define OPAL_HAVE_THREAD_SUPPORT (OPAL_ENABLE_MPI_THREADS || 
> OPAL_ENABLE_PROGRESS_THREADS)
> 
> "we do not have threads at all" seems to me to be OPAL_HAVE_THREADS and 
> not OPAL_HAVE_THREAD_SUPPORT. What do you think ? Maybe 
> OPAL_HAVE_THREAD_SUPPORT should be renamed, too (seems misleading to me).
> 
> The result is that the current default configuration of Open MPI has 
> OPAL_HAVE_THREAD_SUPPORT defined to 0 and Open MPI always returns 
> THREAD_SINGLE, even if it is perfectly capable of THREAD_FUNNELED and 
> THREAD_SERIALIZED.
> 
> Sylvain

Reply via email to