coll/libnbc: demote progress_lock to regular flag
Signed-off-by: Carlos Bederián <bc@famaf.unc.edu.ar>
Этот коммит содержится в:
родитель
9124afbeae
Коммит
1767b218fb
@ -75,7 +75,6 @@ struct ompi_coll_libnbc_component_t {
|
|||||||
opal_free_list_t requests;
|
opal_free_list_t requests;
|
||||||
opal_list_t active_requests;
|
opal_list_t active_requests;
|
||||||
int32_t active_comms;
|
int32_t active_comms;
|
||||||
opal_atomic_lock_t progress_lock; /* protect from recursive calls */
|
|
||||||
opal_mutex_t lock; /* protect access to the active_requests list */
|
opal_mutex_t lock; /* protect access to the active_requests list */
|
||||||
};
|
};
|
||||||
typedef struct ompi_coll_libnbc_component_t ompi_coll_libnbc_component_t;
|
typedef struct ompi_coll_libnbc_component_t ompi_coll_libnbc_component_t;
|
||||||
|
@ -39,6 +39,7 @@ const char *mca_coll_libnbc_component_version_string =
|
|||||||
|
|
||||||
|
|
||||||
static int libnbc_priority = 10;
|
static int libnbc_priority = 10;
|
||||||
|
static bool libnbc_in_progress = false; /* protect from recursive calls */
|
||||||
bool libnbc_ibcast_skip_dt_decision = true;
|
bool libnbc_ibcast_skip_dt_decision = true;
|
||||||
|
|
||||||
|
|
||||||
@ -102,8 +103,6 @@ libnbc_open(void)
|
|||||||
a non-blocking collective started */
|
a non-blocking collective started */
|
||||||
mca_coll_libnbc_component.active_comms = 0;
|
mca_coll_libnbc_component.active_comms = 0;
|
||||||
|
|
||||||
opal_atomic_init(&mca_coll_libnbc_component.progress_lock, OPAL_ATOMIC_UNLOCKED);
|
|
||||||
|
|
||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,37 +262,38 @@ ompi_coll_libnbc_progress(void)
|
|||||||
ompi_coll_libnbc_request_t* request, *next;
|
ompi_coll_libnbc_request_t* request, *next;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
/* return if invoked recursively */
|
|
||||||
if (opal_atomic_trylock(&mca_coll_libnbc_component.progress_lock)) return 0;
|
|
||||||
|
|
||||||
/* process active requests, and use mca_coll_libnbc_component.lock to access the
|
/* process active requests, and use mca_coll_libnbc_component.lock to access the
|
||||||
* mca_coll_libnbc_component.active_requests list */
|
* mca_coll_libnbc_component.active_requests list */
|
||||||
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
|
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
|
||||||
OPAL_LIST_FOREACH_SAFE(request, next, &mca_coll_libnbc_component.active_requests,
|
/* return if invoked recursively */
|
||||||
ompi_coll_libnbc_request_t) {
|
if (!libnbc_in_progress) {
|
||||||
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
|
libnbc_in_progress = true;
|
||||||
res = NBC_Progress(request);
|
|
||||||
if( NBC_CONTINUE != res ) {
|
|
||||||
/* done, remove and complete */
|
|
||||||
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
|
|
||||||
opal_list_remove_item(&mca_coll_libnbc_component.active_requests,
|
|
||||||
&request->super.super.super);
|
|
||||||
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
|
|
||||||
|
|
||||||
if( OMPI_SUCCESS == res || NBC_OK == res || NBC_SUCCESS == res ) {
|
OPAL_LIST_FOREACH_SAFE(request, next, &mca_coll_libnbc_component.active_requests,
|
||||||
request->super.req_status.MPI_ERROR = OMPI_SUCCESS;
|
ompi_coll_libnbc_request_t) {
|
||||||
|
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
|
||||||
|
res = NBC_Progress(request);
|
||||||
|
if( NBC_CONTINUE != res ) {
|
||||||
|
/* done, remove and complete */
|
||||||
|
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
|
||||||
|
opal_list_remove_item(&mca_coll_libnbc_component.active_requests,
|
||||||
|
&request->super.super.super);
|
||||||
|
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
|
||||||
|
|
||||||
|
if( OMPI_SUCCESS == res || NBC_OK == res || NBC_SUCCESS == res ) {
|
||||||
|
request->super.req_status.MPI_ERROR = OMPI_SUCCESS;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
request->super.req_status.MPI_ERROR = res;
|
||||||
|
}
|
||||||
|
ompi_request_complete(&request->super, true);
|
||||||
}
|
}
|
||||||
else {
|
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
|
||||||
request->super.req_status.MPI_ERROR = res;
|
|
||||||
}
|
|
||||||
ompi_request_complete(&request->super, true);
|
|
||||||
}
|
}
|
||||||
OPAL_THREAD_LOCK(&mca_coll_libnbc_component.lock);
|
libnbc_in_progress = false;
|
||||||
}
|
}
|
||||||
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
|
OPAL_THREAD_UNLOCK(&mca_coll_libnbc_component.lock);
|
||||||
|
|
||||||
opal_atomic_unlock(&mca_coll_libnbc_component.progress_lock);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user