1 /*
2 * Copyright (c) 2013 Mellanox Technologies, Inc.
3 * All rights reserved.
4 * $COPYRIGHT$
5 *
6 * Additional copyrights may follow
7 *
8 * $HEADER$
9 */
10
11 #include "oshmem_config.h"
12 #include <stdio.h>
13 #include <stdlib.h>
14
15 #include "oshmem/constants.h"
16 #include "oshmem/mca/atomic/atomic.h"
17 #include "oshmem/mca/atomic/base/base.h"
18
19 #include "atomic_ucx.h"
20
mca_atomic_ucx_fadd(void * target,void * prev,const void * value,size_t nlong,int pe,struct oshmem_op_t * op)21 int mca_atomic_ucx_fadd(void *target,
22 void *prev,
23 const void *value,
24 size_t nlong,
25 int pe,
26 struct oshmem_op_t *op)
27 {
28 ucs_status_t status;
29 spml_ucx_mkey_t *ucx_mkey;
30 uint64_t rva;
31
32 ucx_mkey = mca_spml_ucx_get_mkey(pe, target, (void *)&rva, mca_spml_self);
33 if (NULL == prev) {
34 switch (nlong) {
35 case 4:
36 status = ucp_atomic_add32(mca_spml_self->ucp_peers[pe].ucp_conn,
37 *(uint32_t *)value, rva, ucx_mkey->rkey);
38 break;
39 case 8:
40 status = ucp_atomic_add64(mca_spml_self->ucp_peers[pe].ucp_conn,
41 *(uint64_t *)value, rva, ucx_mkey->rkey);
42 break;
43 default:
44 goto err_size;
45 }
46 }
47 else {
48 switch (nlong) {
49 case 4:
50 status = ucp_atomic_fadd32(mca_spml_self->ucp_peers[pe].ucp_conn,
51 *(uint32_t *)value, rva, ucx_mkey->rkey, prev);
52 break;
53 case 8:
54 status = ucp_atomic_fadd64(mca_spml_self->ucp_peers[pe].ucp_conn,
55 *(uint64_t *)value, rva, ucx_mkey->rkey, prev);
56 break;
57 default:
58 goto err_size;
59 }
60 }
61
62 return ucx_status_to_oshmem(status);
63
64 err_size:
65 ATOMIC_ERROR("[#%d] Type size must be 1/2/4 or 8 bytes.", my_pe);
66 return OSHMEM_ERROR;
67 }
68