ucs_status_t uct_ugni_ep_atomic_add32(uct_ep_h tl_ep, uint32_t add, uint64_t remote_addr, uct_rkey_t rkey) { uct_ugni_ep_t *ep = ucs_derived_of(tl_ep, uct_ugni_ep_t); uct_ugni_rdma_iface_t *iface = ucs_derived_of(tl_ep->iface, uct_ugni_rdma_iface_t); uct_ugni_rdma_fetch_desc_t *fma; UCT_TL_IFACE_GET_TX_DESC(&iface->super.super, &iface->free_desc_famo, fma, return UCS_ERR_NO_RESOURCE); uct_ugni_format_fma_amo(fma, GNI_POST_AMO, GNI_FMA_ATOMIC2_IADD_S, (uint64_t)add, 0, NULL, remote_addr, rkey, LEN_32, ep, NULL, NULL, NULL); ucs_trace_data("Posting AMO ADD, GNI_PostFma of size %"PRIx64" value" "%"PRIx32" to %p, with [%"PRIx64" %"PRIx64"]", fma->super.desc.length, add, (void *)fma->super.desc.remote_addr, fma->super.desc.remote_mem_hndl.qword1, fma->super.desc.remote_mem_hndl.qword2); UCT_TL_EP_STAT_ATOMIC(ucs_derived_of(tl_ep, uct_base_ep_t)); return uct_ugni_post_fma(iface, ep, &fma->super, UCS_OK); }
ucs_status_t uct_ugni_ep_atomic_cswap32(uct_ep_h tl_ep, uint32_t compare, uint32_t swap, uint64_t remote_addr, uct_rkey_t rkey, uint32_t *result, uct_completion_t *comp) { uct_ugni_ep_t *ep = ucs_derived_of(tl_ep, uct_ugni_ep_t); uct_ugni_rdma_iface_t *iface = ucs_derived_of(tl_ep->iface, uct_ugni_rdma_iface_t); uct_ugni_rdma_fetch_desc_t *fma; UCT_TL_IFACE_GET_TX_DESC(&iface->super.super, &iface->free_desc_famo, fma, return UCS_ERR_NO_RESOURCE); uct_ugni_format_fma_amo(fma, GNI_POST_AMO, GNI_FMA_ATOMIC2_FCSWAP_S, (uint64_t)compare, (uint64_t)swap, fma + 1, remote_addr, rkey, LEN_32, ep, comp, uct_ugni_amo_unpack32, (void *)result); ucs_trace_data("Posting AMO CSWAP, GNI_PostFma of size %"PRIx64" value" "%"PRIx32" compare %"PRIx32" to %p, with [%"PRIx64" %"PRIx64"]", fma->super.desc.length, swap, compare, (void *)fma->super.desc.remote_addr, fma->super.desc.remote_mem_hndl.qword1, fma->super.desc.remote_mem_hndl.qword2); UCT_TL_EP_STAT_ATOMIC(ucs_derived_of(tl_ep, uct_base_ep_t)); return uct_ugni_post_fma(iface, ep, &fma->super, UCS_INPROGRESS); }
ucs_status_t uct_ugni_ep_atomic_op64(uct_ep_h tl_ep, uint64_t op, uint64_t remote_addr, uct_rkey_t rkey, gni_fma_cmd_type_t op_type, char *op_str) { uct_ugni_ep_t *ep = ucs_derived_of(tl_ep, uct_ugni_ep_t); uct_ugni_rdma_iface_t *iface = ucs_derived_of(tl_ep->iface, uct_ugni_rdma_iface_t); uct_ugni_rdma_fetch_desc_t *fma; UCT_TL_IFACE_GET_TX_DESC(&iface->super.super, &iface->free_desc_famo, fma, return UCS_ERR_NO_RESOURCE); uct_ugni_format_fma_amo(fma, GNI_POST_AMO, op_type, op, 0, NULL, remote_addr, rkey, LEN_64, ep, NULL, NULL, NULL); ucs_trace_data("Posting AMO %s, GNI_PostFma of size %"PRIx64" value" "%"PRIx64" to %p, with [%"PRIx64" %"PRIx64"]", op_str, fma->super.desc.length, op, (void *)fma->super.desc.remote_addr, fma->super.desc.remote_mem_hndl.qword1, fma->super.desc.remote_mem_hndl.qword2); UCT_TL_EP_STAT_ATOMIC(ucs_derived_of(tl_ep, uct_base_ep_t)); return uct_ugni_post_fma(iface, ep, &fma->super, UCS_OK); }