Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 52 additions & 4 deletions oshmem/mca/spml/ucx/spml_ucx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1644,19 +1644,67 @@ int mca_spml_ucx_put_all_nb(void *dest, const void *source, size_t size, long *c
return OSHMEM_SUCCESS;
}

/* This routine is not implemented */
static inline int mca_spml_ucx_signal_common(shmem_ctx_t ctx,
uint64_t *sig_addr,
uint64_t signal,
int sig_op,
int dst,
int blocking)
{
uint64_t dummy_prev, dummy_fetch;

if (sig_op == SHMEM_SIGNAL_SET) {
/* Use atomic swap to set the signal value */
if (blocking) {
return MCA_ATOMIC_CALL(swap(ctx, (void*)sig_addr, (void*)&dummy_prev,
signal, sizeof(uint64_t), dst));
}
return MCA_ATOMIC_CALL(swap_nb(ctx, &dummy_fetch, (void*)sig_addr, (void*)&dummy_prev,
signal, sizeof(uint64_t), dst));
} else if (sig_op == SHMEM_SIGNAL_ADD) {
/* Use atomic add to add the signal value */
if (blocking) {
return MCA_ATOMIC_CALL(add(ctx, (void*)sig_addr, signal,
sizeof(uint64_t), dst));
}
return MCA_ATOMIC_CALL(fadd_nb(ctx, &dummy_fetch, (void*)sig_addr, (void*)&dummy_prev,
signal, sizeof(uint64_t), dst));
}

SPML_UCX_ERROR("Invalid signal operation: %d", sig_op);
return OSHMEM_ERR_NOT_IMPLEMENTED;
}

int mca_spml_ucx_put_signal(shmem_ctx_t ctx, void* dst_addr, size_t size, void*
src_addr, uint64_t *sig_addr, uint64_t signal, int sig_op, int dst)
{
return OSHMEM_ERR_NOT_IMPLEMENTED;
int res;

res = mca_spml_ucx_put(ctx, dst_addr, size, src_addr, dst);
if (OPAL_UNLIKELY(OSHMEM_SUCCESS != res)) {
return res;
}

return mca_spml_ucx_signal_common(ctx, sig_addr, signal, sig_op, dst, 1);
}

/* This routine is not implemented */
int mca_spml_ucx_put_signal_nb(shmem_ctx_t ctx, void* dst_addr, size_t size,
void* src_addr, uint64_t *sig_addr, uint64_t signal, int sig_op, int
dst)
{
return OSHMEM_ERR_NOT_IMPLEMENTED;
int res;

res = mca_spml_ucx_put_nb(ctx, dst_addr, size, src_addr, dst, NULL);
if (OPAL_UNLIKELY(OSHMEM_SUCCESS != res)) {
return res;
}

res = mca_spml_ucx_fence(ctx);
if (OPAL_UNLIKELY(OSHMEM_SUCCESS != res)) {
return res;
}

return mca_spml_ucx_signal_common(ctx, sig_addr, signal, sig_op, dst, 0);
}

/* This routine is not implemented */
Expand Down