Merge pull request #1397 from hjelmn/enable_thread_multiple
ompi: always enable MPI_THREAD_MULTIPLE support
Этот коммит содержится в:
Коммит
ae0ffbb67f
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
@ -230,16 +230,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;
|
||||
|
||||
@ -261,16 +262,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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -324,15 +324,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();
|
||||
@ -529,7 +521,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));
|
||||
@ -537,7 +528,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. */
|
||||
|
@ -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)",
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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)",
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user