int ompi_osc_ucx_lock_all(int assert, struct ompi_win_t *win) { ompi_osc_ucx_module_t *module = (ompi_osc_ucx_module_t*) win->w_osc_module; int ret = OMPI_SUCCESS; if (module->epoch_type.access != NONE_EPOCH && module->epoch_type.access != FENCE_EPOCH) { return OMPI_ERR_RMA_SYNC; } module->epoch_type.access = PASSIVE_ALL_EPOCH; if (0 == (assert & MPI_MODE_NOCHECK)) { int i, comm_size; module->lock_all_is_nocheck = false; comm_size = ompi_comm_size(module->comm); for (i = 0; i < comm_size; i++) { ret = start_shared(module, i); if (ret != OMPI_SUCCESS) { int j; for (j = 0; j < i; j++) { end_shared(module, j); } return ret; } } } else { module->lock_all_is_nocheck = true; } assert(OMPI_SUCCESS == ret); return OMPI_SUCCESS; }
int ompi_osc_sm_lock(int lock_type, int target, int assert, struct ompi_win_t *win) { ompi_osc_sm_module_t *module = (ompi_osc_sm_module_t*) win->w_osc_module; int ret; if (lock_none != module->outstanding_locks[target]) { return OMPI_ERR_RMA_SYNC; } if (0 == (assert & MPI_MODE_NOCHECK)) { if (MPI_LOCK_EXCLUSIVE == lock_type) { module->outstanding_locks[target] = lock_exclusive; ret = start_exclusive(module, target); } else { module->outstanding_locks[target] = lock_shared; ret = start_shared(module, target); } } else { module->outstanding_locks[target] = lock_nocheck; ret = OMPI_SUCCESS; } return ret; }
int ompi_osc_ucx_lock(int lock_type, int target, int assert, struct ompi_win_t *win) { ompi_osc_ucx_module_t *module = (ompi_osc_ucx_module_t *)win->w_osc_module; ompi_osc_ucx_lock_t *lock = NULL; ompi_osc_ucx_epoch_t original_epoch = module->epoch_type.access; int ret = OMPI_SUCCESS; if (module->lock_count == 0) { if (module->epoch_type.access != NONE_EPOCH && module->epoch_type.access != FENCE_EPOCH) { return OMPI_ERR_RMA_SYNC; } } else { ompi_osc_ucx_lock_t *item = NULL; assert(module->epoch_type.access == PASSIVE_EPOCH); opal_hash_table_get_value_uint32(&module->outstanding_locks, (uint32_t) target, (void **) &item); if (item != NULL) { return OMPI_ERR_RMA_SYNC; } } module->epoch_type.access = PASSIVE_EPOCH; module->lock_count++; assert(module->lock_count <= ompi_comm_size(module->comm)); lock = OBJ_NEW(ompi_osc_ucx_lock_t); lock->target_rank = target; if ((assert & MPI_MODE_NOCHECK) == 0) { lock->is_nocheck = false; if (lock_type == MPI_LOCK_EXCLUSIVE) { ret = start_exclusive(module, target); lock->type = LOCK_EXCLUSIVE; } else { ret = start_shared(module, target); lock->type = LOCK_SHARED; } } else { lock->is_nocheck = true; } if (ret == OMPI_SUCCESS) { opal_hash_table_set_value_uint32(&module->outstanding_locks, (uint32_t)target, (void *)lock); } else { OBJ_RELEASE(lock); module->epoch_type.access = original_epoch; } return ret; }