From 230d04327e654534e14d44808c3e4526773d1331 Mon Sep 17 00:00:00 2001 From: Nathan Hjelm Date: Tue, 23 Feb 2016 09:58:32 -0700 Subject: [PATCH] ompi: always enable MPI_THREAD_MULTIPLE support This commit removes the --with-mpi-thread-multiple option and forces MPI_THREAD_MULTIPLE support. This cleans up an abstration violation in opal where OMPI_ENABLE_THREAD_MULTIPLE determines whether the opal_using_threads is meaningful. To reduce the performance hit on MPI_THREAD_SINGLE programs an OPAL_UNLIKELY is used for the check on opal_using_threads in OPAL_THREAD_* macros. This commit does not clean up the arguments to the various functions that take whether muti-threading support is enabled. That should be done at a later time. Signed-off-by: Nathan Hjelm --- config/ompi_config_threads.m4 | 58 ------------------- configure.ac | 1 - ompi/communicator/comm_cid.c | 2 - ompi/mca/bml/r2/bml_r2_ft.c | 6 +- ompi/mca/io/base/io_base_file_select.c | 12 ++-- ompi/mca/io/base/io_base_frame.c | 2 +- .../mtl/portals4/mtl_portals4_recv_short.c | 23 +------- ompi/mca/pml/ob1/pml_ob1_irecv.c | 28 ++++----- ompi/mca/pml/ob1/pml_ob1_isend.c | 29 +++++----- ompi/mca/pml/v/pml_v_component.c | 2 +- ompi/mca/topo/base/topo_base_lazy_init.c | 3 +- ompi/mpi/c/init_thread.c | 14 ++--- ompi/runtime/ompi_mpi_init.c | 12 +--- ompi/tools/ompi_info/param.c | 14 ++--- opal/threads/mutex.c | 5 +- opal/threads/mutex.h | 31 ++++------ oshmem/runtime/oshmem_shmem_init.c | 14 +---- oshmem/tools/oshmem_info/param.c | 14 ++--- 18 files changed, 67 insertions(+), 203 deletions(-) delete mode 100644 config/ompi_config_threads.m4 diff --git a/config/ompi_config_threads.m4 b/config/ompi_config_threads.m4 deleted file mode 100644 index 4431cad7d9..0000000000 --- a/config/ompi_config_threads.m4 +++ /dev/null @@ -1,58 +0,0 @@ -dnl -dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana -dnl University Research and Technology -dnl Corporation. All rights reserved. -dnl Copyright (c) 2004-2005 The University of Tennessee and The University -dnl of Tennessee Research Foundation. All rights -dnl reserved. -dnl Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, -dnl University of Stuttgart. All rights reserved. -dnl Copyright (c) 2004-2005 The Regents of the University of California. -dnl All rights reserved. -dnl Copyright (c) 2010 Cisco Systems, Inc. All rights reserved. -dnl $COPYRIGHT$ -dnl -dnl Additional copyrights may follow -dnl -dnl $HEADER$ -dnl - -AC_DEFUN([OMPI_CONFIG_THREADS],[ -# -# Arguments: none -# -# Dependencies: None -# -# Modifies: -# none - see called tests -# -# configure threads -# - -# -# MPI_THREAD_MULTIPLE -# -# --enable-mpi-thread-multiple -# #if OMPI_ENABLE_THREAD_MULTIPLE == 0 /* Not available */ -# #if OMPI_ENABLE_THREAD_MULTIPLE == 1 /* Available */ -# -AC_MSG_CHECKING([if want MPI_THREAD_MULTIPLE support]) -AC_ARG_ENABLE([mpi_thread_multiple], - [AC_HELP_STRING([--enable-mpi-thread-multiple], - [Enable MPI_THREAD_MULTIPLE support (default: disabled)])]) - -if test "$enable_mpi_thread_multiple" = "yes" ; then - ompi_want_mpi_threads=1 - OMPI_ENABLE_THREAD_MULTIPLE=1 - AC_MSG_RESULT([Enabled]) -else - # Default: disable - ompi_want_mpi_threads=0 - OMPI_ENABLE_THREAD_MULTIPLE=0 - AC_MSG_RESULT([Disabled]) -fi -AC_DEFINE_UNQUOTED([OMPI_ENABLE_THREAD_MULTIPLE], [$ompi_want_mpi_threads], - [Enable MPI_THREAD_MULTIPLE]) - -])dnl - diff --git a/configure.ac b/configure.ac index 7bb7cbe8eb..84a2055bf8 100644 --- a/configure.ac +++ b/configure.ac @@ -896,7 +896,6 @@ OPAL_CHECK_BROKEN_QSORT # Check out what thread support we have # OPAL_CONFIG_THREADS -OMPI_CONFIG_THREADS CFLAGS="$CFLAGS $THREAD_CFLAGS" CPPFLAGS="$CPPFLAGS $THREAD_CPPFLAGS" diff --git a/ompi/communicator/comm_cid.c b/ompi/communicator/comm_cid.c index f0c332b5dc..ea53930f7c 100644 --- a/ompi/communicator/comm_cid.c +++ b/ompi/communicator/comm_cid.c @@ -514,7 +514,6 @@ static int ompi_comm_register_cid (uint32_t cid) if ( regcom->cid > cid ) { break; } -#if OMPI_ENABLE_THREAD_MULTIPLE if( regcom->cid == cid ) { /** * The MPI standard state that is the user responsability to @@ -527,7 +526,6 @@ static int ompi_comm_register_cid (uint32_t cid) ok = false; break; } -#endif /* OMPI_ENABLE_THREAD_MULTIPLE */ } if (ok) { opal_list_insert_pos (&ompi_registered_comms, (opal_list_item_t *) regcom, diff --git a/ompi/mca/bml/r2/bml_r2_ft.c b/ompi/mca/bml/r2/bml_r2_ft.c index b905db57d4..95fc6ade66 100644 --- a/ompi/mca/bml/r2/bml_r2_ft.c +++ b/ompi/mca/bml/r2/bml_r2_ft.c @@ -170,8 +170,7 @@ int mca_bml_r2_ft_event(int state) * This will cause the BTL components to discover the available * network options on this machine, and post proper modex informaiton. */ - if( OMPI_SUCCESS != (ret = mca_btl_base_select(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE) ) ) { + if( OMPI_SUCCESS != (ret = mca_btl_base_select(OPAL_ENABLE_PROGRESS_THREADS, 1) ) ) { opal_output(0, "bml:r2: ft_event(Restart): Failed to select in BTL framework\n"); return ret; } @@ -257,8 +256,7 @@ int mca_bml_r2_ft_event(int state) * This will cause the BTL components to discover the available * network options on this machine, and post proper modex informaiton. */ - if( OMPI_SUCCESS != (ret = mca_btl_base_select(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE) ) ) { + if( OMPI_SUCCESS != (ret = mca_btl_base_select(OPAL_ENABLE_PROGRESS_THREADS, 1) ) ) { opal_output(0, "bml:r2: ft_event(Restart): Failed to select in BTL framework\n"); return ret; } diff --git a/ompi/mca/io/base/io_base_file_select.c b/ompi/mca/io/base/io_base_file_select.c index 5c822a5307..889e5b6b21 100644 --- a/ompi/mca/io/base/io_base_file_select.c +++ b/ompi/mca/io/base/io_base_file_select.c @@ -215,23 +215,19 @@ int mca_io_base_file_select(ompi_file_t *file, } if (OMPI_SUCCESS != - (ret = mca_fs_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE))) { + (ret = mca_fs_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1))) { return err; } if (OMPI_SUCCESS != - (ret = mca_fcoll_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE))) { + (ret = mca_fcoll_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1))) { return err; } if (OMPI_SUCCESS != - (ret = mca_fbtl_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE))) { + (ret = mca_fbtl_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1))) { return err; } if (OMPI_SUCCESS != - (ret = mca_sharedfp_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE))) { + (ret = mca_sharedfp_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1))) { return err; } } diff --git a/ompi/mca/io/base/io_base_frame.c b/ompi/mca/io/base/io_base_frame.c index 27a32fc47f..03fefc4386 100644 --- a/ompi/mca/io/base/io_base_frame.c +++ b/ompi/mca/io/base/io_base_frame.c @@ -38,7 +38,7 @@ static int mca_io_base_open(mca_base_open_flag_t flags) return ret; } - return mca_io_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, OMPI_ENABLE_THREAD_MULTIPLE); + return mca_io_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1); } MCA_BASE_FRAMEWORK_DECLARE(ompi, io, "I/O", NULL, mca_io_base_open, NULL, diff --git a/ompi/mca/mtl/portals4/mtl_portals4_recv_short.c b/ompi/mca/mtl/portals4/mtl_portals4_recv_short.c index e35d709c56..cddb653582 100644 --- a/ompi/mca/mtl/portals4/mtl_portals4_recv_short.c +++ b/ompi/mca/mtl/portals4/mtl_portals4_recv_short.c @@ -43,7 +43,6 @@ ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev, switch (ev->type) { case PTL_EVENT_AUTO_FREE: -#if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_ACTIVATED: /* May be encountered with multi threading */ @@ -73,19 +72,10 @@ ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev, __FILE__, __LINE__, block->status); break; } -#else - if (OPAL_UNLIKELY(block->release_on_free)) { - opal_list_remove_item(&ompi_mtl_portals4.recv_short_blocks, - &block->base); - ompi_mtl_portals4_recv_short_block_free(block); - } else { - ompi_mtl_portals4_activate_block(block); - } -#endif + break; case PTL_EVENT_AUTO_UNLINK: -#if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_ACTIVATED: /* Normal case */ @@ -115,14 +105,10 @@ ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev, __FILE__, __LINE__, block->status); break; } -#else - block->status = BLOCK_STATUS_WAITING_FREE; - ompi_mtl_portals4.active_recv_short_blocks--; -#endif + break; case PTL_EVENT_LINK: -#if OMPI_ENABLE_THREAD_MULTIPLE OPAL_THREAD_LOCK(&ompi_mtl_portals4.short_block_mutex); switch (block->status) { case BLOCK_STATUS_WAITING_LINK: @@ -138,10 +124,7 @@ ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev, __FILE__, __LINE__, block->status); break; } -#else - block->status = BLOCK_STATUS_ACTIVATED; - ompi_mtl_portals4.active_recv_short_blocks++; -#endif + break; default: diff --git a/ompi/mca/pml/ob1/pml_ob1_irecv.c b/ompi/mca/pml/ob1/pml_ob1_irecv.c index 29128ea7a3..5a494892df 100644 --- a/ompi/mca/pml/ob1/pml_ob1_irecv.c +++ b/ompi/mca/pml/ob1/pml_ob1_irecv.c @@ -10,7 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2007-2015 Los Alamos National Security, LLC. All rights + * Copyright (c) 2007-2016 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2010-2012 Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011 Sandia National Laboratories. All rights reserved. @@ -101,16 +101,16 @@ int mca_pml_ob1_recv(void *addr, mca_pml_ob1_recv_request_t *recvreq = NULL; int rc; -#if !OMPI_ENABLE_THREAD_MULTIPLE - recvreq = mca_pml_ob1_recvreq; - mca_pml_ob1_recvreq = NULL; - if( OPAL_UNLIKELY(NULL == recvreq) ) -#endif /* !OMPI_ENABLE_THREAD_MULTIPLE */ - { - MCA_PML_OB1_RECV_REQUEST_ALLOC(recvreq); - if (NULL == recvreq) - return OMPI_ERR_TEMP_OUT_OF_RESOURCE; - } + if (OPAL_LIKELY(!ompi_mpi_thread_multiple)) { + recvreq = mca_pml_ob1_recvreq; + mca_pml_ob1_recvreq = NULL; + } + + if( OPAL_UNLIKELY(NULL == recvreq) ) { + MCA_PML_OB1_RECV_REQUEST_ALLOC(recvreq); + if (NULL == recvreq) + return OMPI_ERR_TEMP_OUT_OF_RESOURCE; + } MCA_PML_OB1_RECV_REQUEST_INIT(recvreq, addr, count, datatype, src, tag, comm, false); @@ -128,16 +128,12 @@ int mca_pml_ob1_recv(void *addr, rc = recvreq->req_recv.req_base.req_ompi.req_status.MPI_ERROR; -#if OMPI_ENABLE_THREAD_MULTIPLE - MCA_PML_OB1_RECV_REQUEST_RETURN(recvreq); -#else - if( NULL != mca_pml_ob1_recvreq ) { + if (OPAL_UNLIKELY(ompi_mpi_thread_multiple || NULL != mca_pml_ob1_recvreq)) { MCA_PML_OB1_RECV_REQUEST_RETURN(recvreq); } else { mca_pml_ob1_recv_request_fini (recvreq); mca_pml_ob1_recvreq = recvreq; } -#endif return rc; } diff --git a/ompi/mca/pml/ob1/pml_ob1_isend.c b/ompi/mca/pml/ob1/pml_ob1_isend.c index 893e6cebec..9f1e6d9b80 100644 --- a/ompi/mca/pml/ob1/pml_ob1_isend.c +++ b/ompi/mca/pml/ob1/pml_ob1_isend.c @@ -10,7 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2007-2015 Los Alamos National Security, LLC. All rights + * Copyright (c) 2007-2016 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2014 Cisco Systems, Inc. All rights reserved. * Copyright (c) 2015 Research Organization for Information Science @@ -222,16 +222,17 @@ int mca_pml_ob1_send(const void *buf, } } -#if !OMPI_ENABLE_THREAD_MULTIPLE - sendreq = mca_pml_ob1_sendreq; - mca_pml_ob1_sendreq = NULL; - if( OPAL_UNLIKELY(NULL == sendreq) ) -#endif /* !OMPI_ENABLE_THREAD_MULTIPLE */ - { - MCA_PML_OB1_SEND_REQUEST_ALLOC(comm, dst, sendreq); - if (NULL == sendreq) - return OMPI_ERR_TEMP_OUT_OF_RESOURCE; - } + if (OPAL_LIKELY(!ompi_mpi_thread_multiple)) { + sendreq = mca_pml_ob1_sendreq; + mca_pml_ob1_sendreq = NULL; + } + + if( OPAL_UNLIKELY(NULL == sendreq) ) { + MCA_PML_OB1_SEND_REQUEST_ALLOC(comm, dst, sendreq); + if (NULL == sendreq) + return OMPI_ERR_TEMP_OUT_OF_RESOURCE; + } + sendreq->req_send.req_base.req_proc = dst_proc; sendreq->rdma_frag = NULL; @@ -253,16 +254,12 @@ int mca_pml_ob1_send(const void *buf, rc = sendreq->req_send.req_base.req_ompi.req_status.MPI_ERROR; } -#if OMPI_ENABLE_THREAD_MULTIPLE - MCA_PML_OB1_SEND_REQUEST_RETURN(sendreq); -#else - if( NULL != mca_pml_ob1_sendreq ) { + if (OPAL_UNLIKELY(ompi_mpi_thread_multiple || NULL != mca_pml_ob1_sendreq)) { MCA_PML_OB1_SEND_REQUEST_RETURN(sendreq); } else { mca_pml_ob1_send_request_fini (sendreq); mca_pml_ob1_sendreq = sendreq; } -#endif return rc; } diff --git a/ompi/mca/pml/v/pml_v_component.c b/ompi/mca/pml/v/pml_v_component.c index 7cba74891b..3471d5ffff 100644 --- a/ompi/mca/pml/v/pml_v_component.c +++ b/ompi/mca/pml/v/pml_v_component.c @@ -56,7 +56,7 @@ mca_pml_base_component_2_0_0_t mca_pml_v_component = }; static bool pml_v_enable_progress_treads = OPAL_ENABLE_PROGRESS_THREADS; -static bool pml_v_enable_mpi_thread_multiple = OMPI_ENABLE_THREAD_MULTIPLE; +static bool pml_v_enable_mpi_thread_multiple = 1; static char *ompi_pml_vprotocol_include_list; static char *ompi_pml_v_output; diff --git a/ompi/mca/topo/base/topo_base_lazy_init.c b/ompi/mca/topo/base/topo_base_lazy_init.c index c66462a851..7358aada47 100644 --- a/ompi/mca/topo/base/topo_base_lazy_init.c +++ b/ompi/mca/topo/base/topo_base_lazy_init.c @@ -49,8 +49,7 @@ int mca_topo_base_lazy_init(void) } if (OMPI_SUCCESS != - (err = mca_topo_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE))) { + (err = mca_topo_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1))) { return err; } } diff --git a/ompi/mpi/c/init_thread.c b/ompi/mpi/c/init_thread.c index ebcca53279..bbb7806107 100644 --- a/ompi/mpi/c/init_thread.c +++ b/ompi/mpi/c/init_thread.c @@ -1,3 +1,4 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* * Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana * University Research and Technology @@ -13,6 +14,8 @@ * Copyright (c) 2015 Research Organization for Information Science * and Technology (RIST). All rights reserved. * Copyright (c) 2015 Cisco Systems, Inc. All rights reserved. + * Copyright (c) 2016 Los Alamos National Security, LLC. All rights + * reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -50,16 +53,7 @@ int MPI_Init_thread(int *argc, char ***argv, int required, } } - /* - * A thread compliant MPI implementation will be able to return provided - * = MPI_THREAD_MULTIPLE. Such an implementation may always return provided - * = MPI_THREAD_MULTIPLE, irrespective of the value of required. - */ -#if OMPI_ENABLE_THREAD_MULTIPLE - *provided = MPI_THREAD_MULTIPLE; -#else - *provided = MPI_THREAD_SINGLE; -#endif + *provided = required; /* Call the back-end initialization function (we need to put as little in this function as possible so that if it's profiled, we diff --git a/ompi/runtime/ompi_mpi_init.c b/ompi/runtime/ompi_mpi_init.c index 7b4444576c..8df08c2939 100644 --- a/ompi/runtime/ompi_mpi_init.c +++ b/ompi/runtime/ompi_mpi_init.c @@ -325,15 +325,7 @@ void ompi_mpi_thread_level(int requested, int *provided) */ ompi_mpi_thread_requested = requested; - if (OMPI_ENABLE_THREAD_MULTIPLE == 1) { - ompi_mpi_thread_provided = *provided = requested; - } else { - if (MPI_THREAD_MULTIPLE == requested) { - ompi_mpi_thread_provided = *provided = MPI_THREAD_SERIALIZED; - } else { - ompi_mpi_thread_provided = *provided = requested; - } - } + ompi_mpi_thread_provided = *provided = requested; if (!ompi_mpi_main_thread) { ompi_mpi_main_thread = opal_thread_get_self(); @@ -530,7 +522,6 @@ int ompi_mpi_init(int argc, char **argv, int requested, int *provided) memset ( &threadlevel_bf, 0, sizeof(uint8_t)); OMPI_THREADLEVEL_SET_BITFLAG ( ompi_mpi_thread_provided, threadlevel_bf ); -#if OMPI_ENABLE_THREAD_MULTIPLE /* add this bitflag to the modex */ OPAL_MODEX_SEND_STRING(ret, OPAL_PMIX_GLOBAL, "MPI_THREAD_LEVEL", &threadlevel_bf, sizeof(uint8_t)); @@ -538,7 +529,6 @@ int ompi_mpi_init(int argc, char **argv, int requested, int *provided) error = "ompi_mpi_init: modex send thread level"; goto error; } -#endif /* If thread support was enabled, then setup OPAL to allow for them. */ diff --git a/ompi/tools/ompi_info/param.c b/ompi/tools/ompi_info/param.c index 11a11cc96f..8bfc41342d 100644 --- a/ompi/tools/ompi_info/param.c +++ b/ompi/tools/ompi_info/param.c @@ -298,17 +298,11 @@ void ompi_info_do_config(bool want_all) } #if OMPI_RTE_ORTE - (void)asprintf(&threads, "%s (MPI_THREAD_MULTIPLE: %s, OPAL support: %s, OMPI progress: %s, ORTE progress: yes, Event lib: yes)", - "posix", - OMPI_ENABLE_THREAD_MULTIPLE ? "yes" : "no", - OPAL_ENABLE_MULTI_THREADS ? "yes" : "no", - OPAL_ENABLE_PROGRESS_THREADS ? "yes" : "no"); + (void)asprintf(&threads, "%s (MPI_THREAD_MULTIPLE: yes, OPAL support: yes, OMPI progress: %s, ORTE progress: yes, Event lib: yes)", + "posix", OPAL_ENABLE_PROGRESS_THREADS ? "yes" : "no"); #else - (void)asprintf(&threads, "%s (MPI_THREAD_MULTIPLE: %s, OPAL support: %s, OMPI progress: %s, Event lib: yes)", - "posix", - OMPI_ENABLE_THREAD_MULTIPLE ? "yes" : "no", - OPAL_ENABLE_MULTI_THREADS ? "yes" : "no", - OPAL_ENABLE_PROGRESS_THREADS ? "yes" : "no"); + (void)asprintf(&threads, "%s (MPI_THREAD_MULTIPLE: yes, OPAL support: yes, OMPI progress: %s, Event lib: yes)", + "posix", OPAL_ENABLE_PROGRESS_THREADS ? "yes" : "no"); #endif (void)asprintf(&ft_support, "%s (checkpoint thread: %s)", diff --git a/opal/threads/mutex.c b/opal/threads/mutex.c index 23153ea843..9116f9c1f3 100644 --- a/opal/threads/mutex.c +++ b/opal/threads/mutex.c @@ -1,3 +1,4 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ /* * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana * University Research and Technology @@ -9,7 +10,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2007-2013 Los Alamos National Security, LLC. All rights + * Copyright (c) 2007-2016 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2015 Research Organization for Information Science * and Technology (RIST). All rights reserved. @@ -28,9 +29,7 @@ * Wait and see if some upper layer wants to use threads, if support * exists. */ -#if OMPI_ENABLE_THREAD_MULTIPLE bool opal_uses_threads = false; -#endif static void opal_mutex_construct(opal_mutex_t *m) { diff --git a/opal/threads/mutex.h b/opal/threads/mutex.h index d10eb931bd..54918349a8 100644 --- a/opal/threads/mutex.h +++ b/opal/threads/mutex.h @@ -11,7 +11,7 @@ * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2007 Cisco Systems, Inc. All rights reserved. - * Copyright (c) 2007-2015 Los Alamos National Security, LLC. All rights + * Copyright (c) 2007-2016 Los Alamos National Security, LLC. All rights * reserved. * Copyright (c) 2007 Voltaire. All rights reserved. * Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved. @@ -29,6 +29,7 @@ #include "opal_config.h" #include "opal/sys/atomic.h" +#include "opal/prefetch.h" BEGIN_C_DECLS @@ -40,12 +41,10 @@ BEGIN_C_DECLS * Functions for locking of critical sections. */ -#if OMPI_ENABLE_THREAD_MULTIPLE /* * declaring this here so that CL does not complain */ OPAL_DECLSPEC extern bool opal_uses_threads; -#endif /** * Opaque mutex object @@ -144,11 +143,7 @@ BEGIN_C_DECLS * possibility that we may have multiple threads, true will be * returned. */ -#if OMPI_ENABLE_THREAD_MULTIPLE #define opal_using_threads() opal_uses_threads -#else -#define opal_using_threads() 0 -#endif /** * Set whether the process is using multiple threads or not. @@ -168,9 +163,7 @@ BEGIN_C_DECLS */ static inline bool opal_set_using_threads(bool have) { -#if OMPI_ENABLE_THREAD_MULTIPLE opal_uses_threads = have; -#endif return opal_using_threads(); } @@ -190,7 +183,7 @@ static inline bool opal_set_using_threads(bool have) */ #define OPAL_THREAD_LOCK(mutex) \ do { \ - if (opal_using_threads()) { \ + if (OPAL_UNLIKELY(opal_using_threads())) { \ opal_mutex_lock(mutex); \ } \ } while (0) @@ -212,7 +205,7 @@ static inline bool opal_set_using_threads(bool have) * Returns 0 if mutex was locked, non-zero otherwise. */ #define OPAL_THREAD_TRYLOCK(mutex) \ - (opal_using_threads() ? opal_mutex_trylock(mutex) : 0) + (OPAL_UNLIKELY(opal_using_threads()) ? opal_mutex_trylock(mutex) : 0) /** * Unlock a mutex if opal_using_threads() says that multiple threads @@ -229,7 +222,7 @@ static inline bool opal_set_using_threads(bool have) */ #define OPAL_THREAD_UNLOCK(mutex) \ do { \ - if (opal_using_threads()) { \ + if (OPAL_UNLIKELY(opal_using_threads())) { \ opal_mutex_unlock(mutex); \ } \ } while (0) @@ -252,7 +245,7 @@ static inline bool opal_set_using_threads(bool have) */ #define OPAL_THREAD_SCOPED_LOCK(mutex, action) \ do { \ - if(opal_using_threads()) { \ + if(OPAL_UNLIKELY(opal_using_threads())) { \ opal_mutex_lock(mutex); \ action; \ opal_mutex_unlock(mutex); \ @@ -271,7 +264,7 @@ OPAL_THREAD_ADD32(volatile int32_t *addr, int delta) { int32_t ret; - if (opal_using_threads()) { + if (OPAL_UNLIKELY(opal_using_threads())) { ret = opal_atomic_add_32(addr, delta); } else { ret = (*addr += delta); @@ -286,7 +279,7 @@ OPAL_THREAD_ADD64(volatile int64_t *addr, int delta) { int64_t ret; - if (opal_using_threads()) { + if (OPAL_UNLIKELY(opal_using_threads())) { ret = opal_atomic_add_64(addr, delta); } else { ret = (*addr += delta); @@ -301,7 +294,7 @@ OPAL_THREAD_ADD_SIZE_T(volatile size_t *addr, int delta) { size_t ret; - if (opal_using_threads()) { + if (OPAL_UNLIKELY(opal_using_threads())) { ret = opal_atomic_add_size_t(addr, delta); } else { ret = (*addr += delta); @@ -315,15 +308,15 @@ OPAL_THREAD_ADD_SIZE_T(volatile size_t *addr, int delta) #if OPAL_HAVE_ATOMIC_CMPSET_32 #define OPAL_ATOMIC_CMPSET_32(x, y, z) \ - (opal_using_threads() ? opal_atomic_cmpset_32(x, y, z) : OPAL_CMPSET(x, y, z)) + (OPAL_UNLIKELY(opal_using_threads()) ? opal_atomic_cmpset_32(x, y, z) : OPAL_CMPSET(x, y, z)) #endif #if OPAL_HAVE_ATOMIC_CMPSET_64 #define OPAL_ATOMIC_CMPSET_64(x, y, z) \ - (opal_using_threads() ? opal_atomic_cmpset_64(x, y, z) : OPAL_CMPSET(x, y, z)) + (OPAL_UNLIKELY(opal_using_threads()) ? opal_atomic_cmpset_64(x, y, z) : OPAL_CMPSET(x, y, z)) #endif #if OPAL_HAVE_ATOMIC_CMPSET_32 || OPAL_HAVE_ATOMIC_CMPSET_64 #define OPAL_ATOMIC_CMPSET(x, y, z) \ - (opal_using_threads() ? opal_atomic_cmpset(x, y, z) : OPAL_CMPSET(x, y, z)) + (OPAL_UNLIKELY(opal_using_threads()) ? opal_atomic_cmpset(x, y, z) : OPAL_CMPSET(x, y, z)) #endif END_C_DECLS diff --git a/oshmem/runtime/oshmem_shmem_init.c b/oshmem/runtime/oshmem_shmem_init.c index 2d4ff45438..658fb34d03 100644 --- a/oshmem/runtime/oshmem_shmem_init.c +++ b/oshmem/runtime/oshmem_shmem_init.c @@ -279,17 +279,12 @@ static int _shmem_init(int argc, char **argv, int requested, int *provided) goto error; } - if (OSHMEM_SUCCESS - != (ret = mca_spml_base_select(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE))) { + if (OSHMEM_SUCCESS != (ret = mca_spml_base_select(OPAL_ENABLE_PROGRESS_THREADS, 1))) { error = "mca_spml_base_select() failed"; goto error; } - if (OSHMEM_SUCCESS - != (ret = - mca_scoll_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE))) { + if (OSHMEM_SUCCESS != (ret = mca_scoll_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1))) { error = "mca_scoll_base_find_available() failed"; goto error; } @@ -345,10 +340,7 @@ static int _shmem_init(int argc, char **argv, int requested, int *provided) goto error; } - if (OSHMEM_SUCCESS - != (ret = - mca_atomic_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, - OMPI_ENABLE_THREAD_MULTIPLE))) { + if (OSHMEM_SUCCESS != (ret = mca_atomic_base_find_available(OPAL_ENABLE_PROGRESS_THREADS, 1))) { error = "mca_atomic_base_find_available() failed"; goto error; } diff --git a/oshmem/tools/oshmem_info/param.c b/oshmem/tools/oshmem_info/param.c index 57bf210a47..3c5ce569de 100644 --- a/oshmem/tools/oshmem_info/param.c +++ b/oshmem/tools/oshmem_info/param.c @@ -266,17 +266,11 @@ void oshmem_info_do_config(bool want_all) } #if OMPI_RTE_ORTE - (void)asprintf(&threads, "%s (MPI_THREAD_MULTIPLE: %s, OPAL support: %s, OMPI progress: %s, ORTE progress: yes, Event lib: yes)", - "posix", - OMPI_ENABLE_THREAD_MULTIPLE ? "yes" : "no", - OPAL_ENABLE_MULTI_THREADS ? "yes" : "no", - OPAL_ENABLE_PROGRESS_THREADS ? "yes" : "no"); + (void)asprintf(&threads, "%s (MPI_THREAD_MULTIPLE: yes, OPAL support: yes, OMPI progress: %s, ORTE progress: yes, Event lib: yes)", + "posix", OPAL_ENABLE_PROGRESS_THREADS ? "yes" : "no"); #else - (void)asprintf(&threads, "%s (MPI_THREAD_MULTIPLE: %s, OPAL support: %s, OMPI progress: %s, Event lib: yes)", - "posix", - OMPI_ENABLE_THREAD_MULTIPLE ? "yes" : "no", - OPAL_ENABLE_MULTI_THREADS ? "yes" : "no", - OPAL_ENABLE_PROGRESS_THREADS ? "yes" : "no"); + (void)asprintf(&threads, "%s (MPI_THREAD_MULTIPLE: yes, OPAL support: yes, OMPI progress: %s, Event lib: yes)", + "posix", OPAL_ENABLE_PROGRESS_THREADS ? "yes" : "no"); #endif (void)asprintf(&ft_support, "%s (checkpoint thread: %s)",