Skip to content

Commit c19426a

Browse files
committed
btl/ugni: add support for additional atomic operations
This commit adds support for Cray Aries atomic operations. This includes 32-bit and floating point support. Signed-off-by: Nathan Hjelm <[email protected]>
1 parent 23fe19a commit c19426a

File tree

2 files changed

+112
-20
lines changed

2 files changed

+112
-20
lines changed

opal/mca/btl/ugni/btl_ugni_atomic.c

Lines changed: 105 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
22
/*
3-
* Copyright (c) 2014 Los Alamos National Security, LLC. All rights
3+
* Copyright (c) 2014-2016 Los Alamos National Security, LLC. All rights
44
* reserved.
55
* $COPYRIGHT$
66
*
@@ -11,18 +11,66 @@
1111

1212
#include "btl_ugni_rdma.h"
1313

14-
static gni_fma_cmd_type_t famo_cmds[] = {
15-
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC_FADD,
16-
[MCA_BTL_ATOMIC_AND] = GNI_FMA_ATOMIC_FAND,
17-
[MCA_BTL_ATOMIC_OR] = GNI_FMA_ATOMIC_FOR,
18-
[MCA_BTL_ATOMIC_XOR] = GNI_FMA_ATOMIC_FXOR,
14+
static gni_fma_cmd_type_t amo_cmds[][MCA_BTL_ATOMIC_LAST] = {
15+
[OPAL_INT32] = {
16+
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC2_IADD_S,
17+
[MCA_BTL_ATOMIC_LAND] = GNI_FMA_ATOMIC2_AND_S,
18+
[MCA_BTL_ATOMIC_LOR] = GNI_FMA_ATOMIC2_OR_S,
19+
[MCA_BTL_ATOMIC_LXOR] = GNI_FMA_ATOMIC2_XOR_S,
20+
[MCA_BTL_ATOMIC_SWAP] = GNI_FMA_ATOMIC2_SWAP_S,
21+
[MCA_BTL_ATOMIC_MIN] = GNI_FMA_ATOMIC2_IMIN_S,
22+
[MCA_BTL_ATOMIC_MAX] = GNI_FMA_ATOMIC2_IMAX_S,
23+
},
24+
[OPAL_INT64] = {
25+
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC_ADD,
26+
[MCA_BTL_ATOMIC_AND] = GNI_FMA_ATOMIC_AND,
27+
[MCA_BTL_ATOMIC_OR] = GNI_FMA_ATOMIC_OR,
28+
[MCA_BTL_ATOMIC_XOR] = GNI_FMA_ATOMIC_XOR,
29+
[MCA_BTL_ATOMIC_SWAP] = GNI_FMA_ATOMIC2_SWAP,
30+
[MCA_BTL_ATOMIC_MIN] = GNI_FMA_ATOMIC2_IMIN,
31+
[MCA_BTL_ATOMIC_MAX] = GNI_FMA_ATOMIC2_IMAX,
32+
},
33+
[OPAL_FLOAT] = {
34+
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC2_FPADD_S,
35+
[MCA_BTL_ATOMIC_MIN] = GNI_FMA_ATOMIC2_FPMIN_S,
36+
[MCA_BTL_ATOMIC_MAX] = GNI_FMA_ATOMIC2_FPMAX_S,
37+
},
38+
[OPAL_DOUBLE] = {
39+
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC2_FPADD,
40+
[MCA_BTL_ATOMIC_MIN] = GNI_FMA_ATOMIC2_FPMIN,
41+
[MCA_BTL_ATOMIC_MAX] = GNI_FMA_ATOMIC2_FPMAX,
42+
},
1943
};
2044

21-
static gni_fma_cmd_type_t amo_cmds[] = {
22-
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC_ADD,
23-
[MCA_BTL_ATOMIC_AND] = GNI_FMA_ATOMIC_AND,
24-
[MCA_BTL_ATOMIC_OR] = GNI_FMA_ATOMIC_OR,
25-
[MCA_BTL_ATOMIC_XOR] = GNI_FMA_ATOMIC_XOR,
45+
static gni_fma_cmd_type_t famo_cmds[][MCA_BTL_ATOMIC_LAST] = {
46+
[OPAL_INT32] = {
47+
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC2_FIADD_S,
48+
[MCA_BTL_ATOMIC_LAND] = GNI_FMA_ATOMIC2_FAND_S,
49+
[MCA_BTL_ATOMIC_LOR] = GNI_FMA_ATOMIC2_FOR_S,
50+
[MCA_BTL_ATOMIC_LXOR] = GNI_FMA_ATOMIC2_FXOR_S,
51+
[MCA_BTL_ATOMIC_SWAP] = GNI_FMA_ATOMIC2_FSWAP_S,
52+
[MCA_BTL_ATOMIC_MIN] = GNI_FMA_ATOMIC2_FIMIN_S,
53+
[MCA_BTL_ATOMIC_MAX] = GNI_FMA_ATOMIC2_FIMAX_S,
54+
},
55+
[OPAL_INT64] = {
56+
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC_FADD,
57+
[MCA_BTL_ATOMIC_AND] = GNI_FMA_ATOMIC_FAND,
58+
[MCA_BTL_ATOMIC_OR] = GNI_FMA_ATOMIC_FOR,
59+
[MCA_BTL_ATOMIC_XOR] = GNI_FMA_ATOMIC_FXOR,
60+
[MCA_BTL_ATOMIC_SWAP] = GNI_FMA_ATOMIC2_FSWAP,
61+
[MCA_BTL_ATOMIC_MIN] = GNI_FMA_ATOMIC2_FIMIN,
62+
[MCA_BTL_ATOMIC_MAX] = GNI_FMA_ATOMIC2_FIMAX,
63+
},
64+
[OPAL_FLOAT] = {
65+
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC2_FFPADD_S,
66+
[MCA_BTL_ATOMIC_MIN] = GNI_FMA_ATOMIC2_FFPMIN_S,
67+
[MCA_BTL_ATOMIC_MAX] = GNI_FMA_ATOMIC2_FFPMAX_S,
68+
},
69+
[OPAL_DOUBLE] = {
70+
[MCA_BTL_ATOMIC_ADD] = GNI_FMA_ATOMIC2_FFPADD,
71+
[MCA_BTL_ATOMIC_MIN] = GNI_FMA_ATOMIC2_FFPMIN,
72+
[MCA_BTL_ATOMIC_MAX] = GNI_FMA_ATOMIC2_FFPMAX,
73+
},
2674
};
2775

2876
int mca_btl_ugni_aop (struct mca_btl_base_module_t *btl, struct mca_btl_base_endpoint_t *endpoint,
@@ -32,7 +80,20 @@ int mca_btl_ugni_aop (struct mca_btl_base_module_t *btl, struct mca_btl_base_end
3280
{
3381
gni_mem_handle_t dummy = {0, 0};
3482
mca_btl_ugni_post_descriptor_t *post_desc;
35-
int rc;
83+
int gni_op, rc, type;
84+
size_t size;
85+
86+
size = (MCA_BTL_ATOMIC_FLAG_32BIT & flags) ? 4 : 8;
87+
if (MCA_BTL_ATOMIC_FLAG_FLOAT & flags) {
88+
type = (MCA_BTL_ATOMIC_FLAG_32BIT & flags) ? OPAL_FLOAT : OPAL_DOUBLE;
89+
} else {
90+
type = (MCA_BTL_ATOMIC_FLAG_32BIT & flags) ? OPAL_INT32 : OPAL_INT64;
91+
}
92+
93+
gni_op = amo_cmds[type][op];
94+
if (0 == gni_op) {
95+
return OPAL_ERR_NOT_SUPPORTED;
96+
}
3697

3798
rc = mca_btl_ugni_check_endpoint_state_rdma (endpoint);
3899
if (OPAL_UNLIKELY(OPAL_SUCCESS != rc)) {
@@ -45,15 +106,19 @@ int mca_btl_ugni_aop (struct mca_btl_base_module_t *btl, struct mca_btl_base_end
45106
}
46107

47108
init_gni_post_desc (&post_desc->desc, order, GNI_POST_AMO, 0, dummy, remote_address,
48-
remote_handle->gni_handle, 8, 0);
49-
post_desc->desc.base.amo_cmd = amo_cmds[op];
109+
remote_handle->gni_handle, size, 0);
110+
post_desc->desc.base.amo_cmd = gni_op;
50111

51112
post_desc->desc.base.first_operand = operand;
52113

53114
OPAL_THREAD_LOCK(&endpoint->btl->device->dev_lock);
54115
rc = GNI_PostFma (endpoint->rdma_ep_handle, &post_desc->desc.base);
55116
OPAL_THREAD_UNLOCK(&endpoint->btl->device->dev_lock);
56117
if (GNI_RC_SUCCESS != rc) {
118+
mca_btl_ugni_return_post_descriptor (endpoint->btl, post_desc);
119+
if (GNI_RC_ILLEGAL_OP == rc) {
120+
return OPAL_ERR_NOT_SUPPORTED;
121+
}
57122
return OPAL_ERR_OUT_OF_RESOURCE;
58123
}
59124

@@ -67,7 +132,20 @@ int mca_btl_ugni_afop (struct mca_btl_base_module_t *btl, struct mca_btl_base_en
67132
void *cbcontext, void *cbdata)
68133
{
69134
mca_btl_ugni_post_descriptor_t *post_desc;
70-
int rc;
135+
int gni_op, rc, type;
136+
size_t size;
137+
138+
size = (MCA_BTL_ATOMIC_FLAG_32BIT & flags) ? 4 : 8;
139+
if (MCA_BTL_ATOMIC_FLAG_FLOAT & flags) {
140+
type = (MCA_BTL_ATOMIC_FLAG_32BIT & flags) ? OPAL_FLOAT : OPAL_DOUBLE;
141+
} else {
142+
type = (MCA_BTL_ATOMIC_FLAG_32BIT & flags) ? OPAL_INT32 : OPAL_INT64;
143+
}
144+
145+
gni_op = famo_cmds[type][op];
146+
if (0 == gni_op) {
147+
return OPAL_ERR_NOT_SUPPORTED;
148+
}
71149

72150
rc = mca_btl_ugni_check_endpoint_state_rdma (endpoint);
73151
if (OPAL_UNLIKELY(OPAL_SUCCESS != rc)) {
@@ -81,8 +159,8 @@ int mca_btl_ugni_afop (struct mca_btl_base_module_t *btl, struct mca_btl_base_en
81159

82160

83161
init_gni_post_desc (&post_desc->desc, order, GNI_POST_AMO, (intptr_t) local_address, local_handle->gni_handle,
84-
remote_address, remote_handle->gni_handle, 8, 0);
85-
post_desc->desc.base.amo_cmd = famo_cmds[op];
162+
remote_address, remote_handle->gni_handle, size, 0);
163+
post_desc->desc.base.amo_cmd = gni_op;
86164

87165
post_desc->desc.base.first_operand = operand;
88166

@@ -91,6 +169,9 @@ int mca_btl_ugni_afop (struct mca_btl_base_module_t *btl, struct mca_btl_base_en
91169
OPAL_THREAD_UNLOCK(&endpoint->btl->device->dev_lock);
92170
if (GNI_RC_SUCCESS != rc) {
93171
mca_btl_ugni_return_post_descriptor (endpoint->btl, post_desc);
172+
if (GNI_RC_ILLEGAL_OP == rc) {
173+
return OPAL_ERR_NOT_SUPPORTED;
174+
}
94175
return OPAL_ERR_OUT_OF_RESOURCE;
95176
}
96177

@@ -103,7 +184,11 @@ int mca_btl_ugni_acswap (struct mca_btl_base_module_t *btl, struct mca_btl_base_
103184
int order, mca_btl_base_rdma_completion_fn_t cbfunc, void *cbcontext, void *cbdata)
104185
{
105186
mca_btl_ugni_post_descriptor_t *post_desc;
106-
int rc;
187+
int gni_op, rc;
188+
size_t size;
189+
190+
gni_op = (MCA_BTL_ATOMIC_FLAG_32BIT & flags) ? GNI_FMA_ATOMIC2_CSWAP_S : GNI_FMA_ATOMIC_CSWAP;
191+
size = (MCA_BTL_ATOMIC_FLAG_32BIT & flags) ? 4 : 8;
107192

108193
rc = mca_btl_ugni_check_endpoint_state_rdma (endpoint);
109194
if (OPAL_UNLIKELY(OPAL_SUCCESS != rc)) {
@@ -117,8 +202,8 @@ int mca_btl_ugni_acswap (struct mca_btl_base_module_t *btl, struct mca_btl_base_
117202

118203

119204
init_gni_post_desc (&post_desc->desc, order, GNI_POST_AMO, (intptr_t) local_address, local_handle->gni_handle,
120-
remote_address, remote_handle->gni_handle, 8, 0);
121-
post_desc->desc.base.amo_cmd = GNI_FMA_ATOMIC_CSWAP;
205+
remote_address, remote_handle->gni_handle, size, 0);
206+
post_desc->desc.base.amo_cmd = gni_op;
122207

123208
post_desc->desc.base.first_operand = compare;
124209
post_desc->desc.base.second_operand = value;

opal/mca/btl/ugni/btl_ugni_component.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,13 @@ btl_ugni_component_register(void)
291291
MCA_BTL_ATOMIC_SUPPORTS_AND | MCA_BTL_ATOMIC_SUPPORTS_OR | MCA_BTL_ATOMIC_SUPPORTS_XOR |
292292
MCA_BTL_ATOMIC_SUPPORTS_CSWAP;
293293

294+
if (GNI_DEVICE_ARIES == device_type) {
295+
/* aries supports additional atomic operations */
296+
mca_btl_ugni_module.super.btl_atomic_flags |= MCA_BTL_ATOMIC_SUPPORTS_MIN | MCA_BTL_ATOMIC_SUPPORTS_MAX |
297+
MCA_BTL_ATOMIC_SUPPORTS_LAND | MCA_BTL_ATOMIC_SUPPORTS_LOR | MCA_BTL_ATOMIC_SUPPORTS_LXOR |
298+
MCA_BTL_ATOMIC_SUPPORTS_32BIT | MCA_BTL_ATOMIC_SUPPORTS_FLOAT;
299+
}
300+
294301
mca_btl_ugni_module.super.btl_registration_handle_size = sizeof (mca_btl_base_registration_handle_t);
295302

296303
mca_btl_ugni_module.super.btl_bandwidth = 40000; /* Mbs */

0 commit comments

Comments
 (0)