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