int ompi_osc_ucx_unlock_all(struct ompi_win_t *win) { ompi_osc_ucx_module_t *module = (ompi_osc_ucx_module_t*)win->w_osc_module; int comm_size = ompi_comm_size(module->comm); int ret = OMPI_SUCCESS; if (module->epoch_type.access != PASSIVE_ALL_EPOCH) { return OMPI_ERR_RMA_SYNC; } assert(module->lock_count == 0); ret = opal_common_ucx_worker_flush(mca_osc_ucx_component.ucp_worker); if (ret != OMPI_SUCCESS) { return ret; } module->global_ops_num = 0; memset(module->per_target_ops_nums, 0, sizeof(int) * comm_size); if (!module->lock_all_is_nocheck) { int i; for (i = 0; i < comm_size; i++) { ret |= end_shared(module, i); } } module->epoch_type.access = NONE_EPOCH; return ret; }
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; }
void shared_occs::display(std::ostream & out, ast_manager & m) const { iterator it = begin_shared(); iterator end = end_shared(); for (; it != end; ++it) { out << mk_ismt2_pp(*it, m) << "\n"; } }
int ompi_osc_ucx_unlock(int target, 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; int ret = OMPI_SUCCESS; ucp_ep_h ep; if (module->epoch_type.access != PASSIVE_EPOCH) { return OMPI_ERR_RMA_SYNC; } opal_hash_table_get_value_uint32(&module->outstanding_locks, (uint32_t) target, (void **) &lock); if (lock == NULL) { return OMPI_ERR_RMA_SYNC; } opal_hash_table_remove_value_uint32(&module->outstanding_locks, (uint32_t)target); ep = OSC_UCX_GET_EP(module->comm, target); ret = opal_common_ucx_ep_flush(ep, mca_osc_ucx_component.ucp_worker); if (ret != OMPI_SUCCESS) { return ret; } module->global_ops_num -= module->per_target_ops_nums[target]; module->per_target_ops_nums[target] = 0; if (lock->is_nocheck == false) { if (lock->type == LOCK_EXCLUSIVE) { ret = end_exclusive(module, target); } else { ret = end_shared(module, target); } } OBJ_RELEASE(lock); module->lock_count--; assert(module->lock_count >= 0); if (module->lock_count == 0) { module->epoch_type.access = NONE_EPOCH; assert(module->global_ops_num == 0); } return ret; }
int ompi_osc_sm_unlock(int target, struct ompi_win_t *win) { ompi_osc_sm_module_t *module = (ompi_osc_sm_module_t*) win->w_osc_module; int ret; /* ensure all memory operations have completed */ opal_atomic_mb(); switch (module->outstanding_locks[target]) { case lock_none: return OMPI_ERR_RMA_SYNC; case lock_nocheck: ret = OMPI_SUCCESS; break; case lock_exclusive: ret = end_exclusive(module, target); break; case lock_shared: ret = end_shared(module, target); break; default: // This is an OMPI programming error -- cause some pain. assert(module->outstanding_locks[target] == lock_none || module->outstanding_locks[target] == lock_nocheck || module->outstanding_locks[target] == lock_exclusive || module->outstanding_locks[target] == lock_shared); // In non-developer builds, assert() will be a no-op, so // ensure the error gets reported opal_output(0, "Unknown lock type in ompi_osc_sm_unlock -- this is an OMPI programming error"); ret = OMPI_ERR_BAD_PARAM; break; } module->outstanding_locks[target] = lock_none; return ret; }