OSHMEM/SMPL/UCX: Add real fence support
+ Add quiet method to SPML, so it can have different implementation with fence. + Use ucp_worker_fence for spml_fence method of UCX SPML Signed-off-by: Mikhail Brinskii <mikhailb@mellanox.com>
Этот коммит содержится в:
родитель
09f73f1cd5
Коммит
8e9d401938
@ -72,10 +72,10 @@ int mca_scoll_basic_alltoall(struct oshmem_group_t *group,
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fence (which currently acts as quiet) is needed
|
/* quiet is needed because scoll level barrier does not
|
||||||
* because scoll level barrier does not guarantee put completion
|
* guarantee put completion
|
||||||
*/
|
*/
|
||||||
MCA_SPML_CALL(fence());
|
MCA_SPML_CALL(quiet());
|
||||||
|
|
||||||
/* Wait for operation completion */
|
/* Wait for operation completion */
|
||||||
SCOLL_VERBOSE(14, "[#%d] Wait for operation completion", group->my_pe);
|
SCOLL_VERBOSE(14, "[#%d] Wait for operation completion", group->my_pe);
|
||||||
|
@ -167,8 +167,7 @@ static int _algorithm_central_counter(struct oshmem_group_t *group,
|
|||||||
The root could leave the first barrier and in the second barrier it could get SHMEM_SYNC_WAIT value on
|
The root could leave the first barrier and in the second barrier it could get SHMEM_SYNC_WAIT value on
|
||||||
remote node before the remote node receives its SHMEM_SYNC_RUN value in the first barrier
|
remote node before the remote node receives its SHMEM_SYNC_RUN value in the first barrier
|
||||||
*/
|
*/
|
||||||
/* TODO: actually it must be quiet */
|
MCA_SPML_CALL(quiet());
|
||||||
MCA_SPML_CALL(fence());
|
|
||||||
}
|
}
|
||||||
/* Wait for RUN signal */
|
/* Wait for RUN signal */
|
||||||
else {
|
else {
|
||||||
|
@ -146,10 +146,10 @@ static int _algorithm_central_counter(struct oshmem_group_t *group,
|
|||||||
rc = MCA_SPML_CALL(put(target, nlong, (void *)source, pe_cur));
|
rc = MCA_SPML_CALL(put(target, nlong, (void *)source, pe_cur));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* fence (which currently acts as quiet) is needed
|
/* quiet is needed because scoll level barrier does not
|
||||||
* because scoll level barrier does not guarantee put completion
|
* guarantee put completion
|
||||||
*/
|
*/
|
||||||
MCA_SPML_CALL(fence());
|
MCA_SPML_CALL(quiet());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc == OSHMEM_SUCCESS) {
|
if (rc == OSHMEM_SUCCESS) {
|
||||||
|
@ -153,11 +153,7 @@ int mca_spml_base_wait(void* addr, int cmp, void* value, int datatype)
|
|||||||
*/
|
*/
|
||||||
int mca_spml_base_wait_nb(void* handle)
|
int mca_spml_base_wait_nb(void* handle)
|
||||||
{
|
{
|
||||||
/* TODO fence is a gag for more accurate code
|
MCA_SPML_CALL(quiet());
|
||||||
* Use shmem_quiet() (or a function calling shmem_quiet()) or
|
|
||||||
* shmem_wait_nb() to force completion of transfers for non-blocking operations.
|
|
||||||
*/
|
|
||||||
MCA_SPML_CALL(fence());
|
|
||||||
|
|
||||||
return OSHMEM_SUCCESS;
|
return OSHMEM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -168,6 +168,7 @@ mca_spml_ikrit_t mca_spml_ikrit = {
|
|||||||
mca_spml_ikrit_send,
|
mca_spml_ikrit_send,
|
||||||
mca_spml_base_wait,
|
mca_spml_base_wait,
|
||||||
mca_spml_base_wait_nb,
|
mca_spml_base_wait_nb,
|
||||||
|
mca_spml_ikrit_fence, /* fence is implemented as quiet */
|
||||||
mca_spml_ikrit_fence,
|
mca_spml_ikrit_fence,
|
||||||
mca_spml_ikrit_cache_mkeys,
|
mca_spml_ikrit_cache_mkeys,
|
||||||
mca_spml_base_rmkey_free,
|
mca_spml_base_rmkey_free,
|
||||||
|
@ -275,12 +275,19 @@ typedef int (*mca_spml_base_module_send_fn_t)(void *buf,
|
|||||||
mca_spml_base_put_mode_t mode);
|
mca_spml_base_put_mode_t mode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wait for completion of all outstanding put() requests
|
* Assures ordering of delivery of put() requests
|
||||||
*
|
*
|
||||||
* @return - OSHMEM_SUCCESS or failure status.
|
* @return - OSHMEM_SUCCESS or failure status.
|
||||||
*/
|
*/
|
||||||
typedef int (*mca_spml_base_module_fence_fn_t)(void);
|
typedef int (*mca_spml_base_module_fence_fn_t)(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wait for completion of all outstanding put() requests
|
||||||
|
*
|
||||||
|
* @return - OSHMEM_SUCCESS or failure status.
|
||||||
|
*/
|
||||||
|
typedef int (*mca_spml_base_module_quiet_fn_t)(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for completion of a non-blocking put or get issued by the calling PE.
|
* Waits for completion of a non-blocking put or get issued by the calling PE.
|
||||||
*
|
*
|
||||||
@ -321,6 +328,7 @@ struct mca_spml_base_module_1_0_0_t {
|
|||||||
mca_spml_base_module_wait_fn_t spml_wait;
|
mca_spml_base_module_wait_fn_t spml_wait;
|
||||||
mca_spml_base_module_wait_nb_fn_t spml_wait_nb;
|
mca_spml_base_module_wait_nb_fn_t spml_wait_nb;
|
||||||
mca_spml_base_module_fence_fn_t spml_fence;
|
mca_spml_base_module_fence_fn_t spml_fence;
|
||||||
|
mca_spml_base_module_quiet_fn_t spml_quiet;
|
||||||
|
|
||||||
mca_spml_base_module_mkey_unpack_fn_t spml_rmkey_unpack;
|
mca_spml_base_module_mkey_unpack_fn_t spml_rmkey_unpack;
|
||||||
mca_spml_base_module_mkey_free_fn_t spml_rmkey_free;
|
mca_spml_base_module_mkey_free_fn_t spml_rmkey_free;
|
||||||
|
@ -60,8 +60,8 @@ mca_spml_ucx_t mca_spml_ucx = {
|
|||||||
mca_spml_ucx_send,
|
mca_spml_ucx_send,
|
||||||
mca_spml_base_wait,
|
mca_spml_base_wait,
|
||||||
mca_spml_base_wait_nb,
|
mca_spml_base_wait_nb,
|
||||||
mca_spml_ucx_quiet, /* At the moment fence is the same as quite for
|
mca_spml_ucx_fence,
|
||||||
every spml */
|
mca_spml_ucx_quiet,
|
||||||
mca_spml_ucx_rmkey_unpack,
|
mca_spml_ucx_rmkey_unpack,
|
||||||
mca_spml_ucx_rmkey_free,
|
mca_spml_ucx_rmkey_free,
|
||||||
mca_spml_ucx_rmkey_ptr,
|
mca_spml_ucx_rmkey_ptr,
|
||||||
@ -520,7 +520,7 @@ int mca_spml_ucx_deregister(sshmem_mkey_t *mkeys)
|
|||||||
spml_ucx_mkey_t *ucx_mkey;
|
spml_ucx_mkey_t *ucx_mkey;
|
||||||
map_segment_t *mem_seg;
|
map_segment_t *mem_seg;
|
||||||
|
|
||||||
MCA_SPML_CALL(fence());
|
MCA_SPML_CALL(quiet());
|
||||||
if (!mkeys)
|
if (!mkeys)
|
||||||
return OSHMEM_SUCCESS;
|
return OSHMEM_SUCCESS;
|
||||||
|
|
||||||
@ -598,7 +598,7 @@ int mca_spml_ucx_fence(void)
|
|||||||
{
|
{
|
||||||
ucs_status_t err;
|
ucs_status_t err;
|
||||||
|
|
||||||
err = ucp_worker_flush(mca_spml_ucx.ucp_worker);
|
err = ucp_worker_fence(mca_spml_ucx.ucp_worker);
|
||||||
if (UCS_OK != err) {
|
if (UCS_OK != err) {
|
||||||
SPML_ERROR("fence failed: %s", ucs_status_string(err));
|
SPML_ERROR("fence failed: %s", ucs_status_string(err));
|
||||||
oshmem_shmem_abort(-1);
|
oshmem_shmem_abort(-1);
|
||||||
|
@ -36,7 +36,7 @@ void shmem_barrier(int PE_start, int logPE_stride, int PE_size, long *pSync)
|
|||||||
|
|
||||||
#if OSHMEM_SPEC_COMPAT == 1
|
#if OSHMEM_SPEC_COMPAT == 1
|
||||||
/* all outstanding puts must be completed */
|
/* all outstanding puts must be completed */
|
||||||
shmem_fence();
|
shmem_quiet();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Create group basing PE_start, logPE_stride and PE_size */
|
/* Create group basing PE_start, logPE_stride and PE_size */
|
||||||
@ -54,7 +54,7 @@ void shmem_barrier_all(void)
|
|||||||
|
|
||||||
#if OSHMEM_SPEC_COMPAT == 1
|
#if OSHMEM_SPEC_COMPAT == 1
|
||||||
/* all outstanding puts must be completed */
|
/* all outstanding puts must be completed */
|
||||||
shmem_fence();
|
shmem_quiet();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (mca_scoll_sync_array) {
|
if (mca_scoll_sync_array) {
|
||||||
|
@ -23,5 +23,5 @@
|
|||||||
void shmem_quiet(void)
|
void shmem_quiet(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
MCA_SPML_CALL(fence());
|
MCA_SPML_CALL(quiet());
|
||||||
}
|
}
|
||||||
|
@ -30,5 +30,5 @@ SHMEM_GENERATE_FORTRAN_BINDINGS_SUB (void,
|
|||||||
|
|
||||||
void shmem_quiet_f(void)
|
void shmem_quiet_f(void)
|
||||||
{
|
{
|
||||||
MCA_SPML_CALL(fence());
|
MCA_SPML_CALL(quiet());
|
||||||
}
|
}
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user