Skip to content

Commit

Permalink
oshmem: Align OSHMEM API with spec v1.3 (Add scoll/alltoall interface)
Browse files Browse the repository at this point in the history
  • Loading branch information
igor-ivanov committed Mar 21, 2016
1 parent 84b79db commit 50906b3
Show file tree
Hide file tree
Showing 11 changed files with 102 additions and 13 deletions.
38 changes: 38 additions & 0 deletions oshmem/include/shmem.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -101,13 +101,15 @@ enum shmem_wait_ops {
#define _SHMEM_BCAST_SYNC_SIZE (1 + _SHMEM_BARRIER_SYNC_SIZE)
#define _SHMEM_COLLECT_SYNC_SIZE (1 + _SHMEM_BCAST_SYNC_SIZE)
#define _SHMEM_REDUCE_SYNC_SIZE (1 + _SHMEM_BCAST_SYNC_SIZE)
#define _SHMEM_ALLTOALL_SYNC_SIZE (1)
#define _SHMEM_REDUCE_MIN_WRKDATA_SIZE (1)
#define _SHMEM_SYNC_VALUE (-1)

#define SHMEM_BARRIER_SYNC_SIZE _SHMEM_BARRIER_SYNC_SIZE
#define SHMEM_BCAST_SYNC_SIZE _SHMEM_BCAST_SYNC_SIZE
#define SHMEM_COLLECT_SYNC_SIZE _SHMEM_COLLECT_SYNC_SIZE
#define SHMEM_REDUCE_SYNC_SIZE _SHMEM_REDUCE_SYNC_SIZE
#define SHMEM_ALLTOALL_SYNC_SIZE _SHMEM_ALLTOALL_SYNC_SIZE
#define SHMEM_REDUCE_MIN_WRKDATA_SIZE _SHMEM_REDUCE_MIN_WRKDATA_SIZE
#define SHMEM_SYNC_VALUE _SHMEM_SYNC_VALUE

Expand Down Expand Up @@ -191,6 +193,24 @@ OSHMEM_DECLSPEC void shmem_iput32(void* target, const void* source, ptrdiff_t ts
OSHMEM_DECLSPEC void shmem_iput64(void* target, const void* source, ptrdiff_t tst, ptrdiff_t sst,size_t len, int pe);
OSHMEM_DECLSPEC void shmem_iput128(void* target, const void* source, ptrdiff_t tst, ptrdiff_t sst,size_t len, int pe);

/*
* Nonblocking put routines
*/
OSHMEM_DECLSPEC void shmem_putmem_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_char_put_nbi(char *target, const char *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_short_put_nbi(short *target, const short *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_int_put_nbi(int* target, const int* source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_long_put_nbi(long *target, const long *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_longlong_put_nbi(long long *target, const long long *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_float_put_nbi(float *target, const float *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_double_put_nbi(double *target, const double *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_longdouble_put_nbi(long double *target, const long double *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_put8_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_put16_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_put32_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_put64_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_put128_nbi(void *target, const void *source, size_t len, int pe);

/*
* Elemental get routines
*/
Expand Down Expand Up @@ -232,6 +252,24 @@ OSHMEM_DECLSPEC void shmem_iget32(void* target, const void* source, ptrdiff_t ts
OSHMEM_DECLSPEC void shmem_iget64(void* target, const void* source, ptrdiff_t tst, ptrdiff_t sst,size_t len, int pe);
OSHMEM_DECLSPEC void shmem_iget128(void* target, const void* source, ptrdiff_t tst, ptrdiff_t sst,size_t len, int pe);

/*
* Nonblocking data get routines
*/
OSHMEM_DECLSPEC void shmem_getmem_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_char_get_nbi(char *target, const char *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_short_get_nbi(short *target, const short *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_int_get_nbi(int *target, const int *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_long_get_nbi(long *target, const long *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_longlong_get_nbi(long long *target, const long long *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_float_get_nbi(float *target, const float *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_double_get_nbi(double *target, const double *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_longdouble_get_nbi(long double *target, const long double *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_get8_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_get16_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_get32_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_get64_nbi(void *target, const void *source, size_t len, int pe);
OSHMEM_DECLSPEC void shmem_get128_nbi(void *target, const void *source, size_t len, int pe);

/*
* Atomic operations
*/
Expand Down
1 change: 1 addition & 0 deletions oshmem/mca/scoll/base/scoll_base_frame.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ static void scoll_base_module_construct(mca_scoll_base_module_t *m)
m->scoll_broadcast = NULL;
m->scoll_collect = NULL;
m->scoll_reduce = NULL;
m->scoll_alltoall = NULL;
m->scoll_module_enable = NULL;
}

Expand Down
28 changes: 24 additions & 4 deletions oshmem/mca/scoll/base/scoll_base_select.c
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,22 @@ static int scoll_null_reduce(struct oshmem_group_t *group,
return OSHMEM_SUCCESS;
}

static int scoll_null_alltoall(struct oshmem_group_t *group,
void *target,
const void *source,
ptrdiff_t dst, ptrdiff_t sst,
size_t nlong,
long *pSync,
int alg)
{
if (oshmem_proc_group_is_member(group)) {
SCOLL_ERROR("internal error");
oshmem_shmem_abort(-1);
return OSHMEM_ERROR;
}
return OSHMEM_SUCCESS;
}

/*
* Stuff for the OBJ interface
*/
Expand Down Expand Up @@ -160,6 +176,7 @@ int mca_scoll_base_group_unselect(struct oshmem_group_t * group)
CLOSE(group, broadcast);
CLOSE(group, collect);
CLOSE(group, reduce);
CLOSE(group, alltoall);

/* All done */
return OSHMEM_SUCCESS;
Expand All @@ -184,6 +201,7 @@ int mca_scoll_base_select(struct oshmem_group_t *group)
group->g_scoll.scoll_broadcast = scoll_null_broadcast;
group->g_scoll.scoll_collect = scoll_null_collect;
group->g_scoll.scoll_reduce = scoll_null_reduce;
group->g_scoll.scoll_alltoall = scoll_null_alltoall;
return OSHMEM_SUCCESS;
}
SCOLL_VERBOSE(10,
Expand All @@ -206,10 +224,11 @@ int mca_scoll_base_select(struct oshmem_group_t *group)
if (OSHMEM_SUCCESS != ret) {
mca_scoll_base_group_unselect(group);
} else {
COPY(avail->ac_module, group, barrier);
COPY(avail->ac_module, group, broadcast);
COPY(avail->ac_module, group, collect);
COPY(avail->ac_module, group, reduce);
COPY(avail->ac_module, group, barrier);
COPY(avail->ac_module, group, alltoall);
}
OBJ_RELEASE(avail->ac_module);
OBJ_RELEASE(avail);
Expand All @@ -220,16 +239,17 @@ int mca_scoll_base_select(struct oshmem_group_t *group)
if ((NULL == group->g_scoll.scoll_barrier)
|| (NULL == group->g_scoll.scoll_broadcast)
|| (NULL == group->g_scoll.scoll_collect)
|| (NULL == group->g_scoll.scoll_reduce)) {
|| (NULL == group->g_scoll.scoll_reduce)
|| (NULL == group->g_scoll.scoll_alltoall)) {
mca_scoll_base_group_unselect(group);
return OSHMEM_ERR_NOT_FOUND;
}

return OSHMEM_SUCCESS;
}

static int avail_coll_compare (opal_list_item_t **a,
opal_list_item_t **b)
static int avail_coll_compare(opal_list_item_t **a,
opal_list_item_t **b)
{
avail_com_t *acom = (avail_com_t *) *a;
avail_com_t *bcom = (avail_com_t *) *b;
Expand Down
5 changes: 3 additions & 2 deletions oshmem/mca/scoll/basic/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#
# Copyright (c) 2013 Mellanox Technologies, Inc.
# Copyright (c) 2013-2016 Mellanox Technologies, Inc.
# All rights reserved.
# $COPYRIGHT$
#
Expand All @@ -15,7 +15,8 @@ sources = \
scoll_basic_barrier.c \
scoll_basic_broadcast.c \
scoll_basic_collect.c \
scoll_basic_reduce.c
scoll_basic_reduce.c \
scoll_basic_alltoall.c


# Make the output library in this directory, and name it either
Expand Down
9 changes: 8 additions & 1 deletion oshmem/mca/scoll/basic/scoll_basic.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013 Mellanox Technologies, Inc.
* Copyright (c) 2013-2016 Mellanox Technologies, Inc.
* All rights reserved.
* $COPYRIGHT$
*
Expand Down Expand Up @@ -77,6 +77,13 @@ int mca_scoll_basic_reduce(struct oshmem_group_t *group,
long *pSync,
void *pWrk,
int alg);
int mca_scoll_basic_alltoall(struct oshmem_group_t *group,
void *target,
const void *source,
ptrdiff_t dst, ptrdiff_t sst,
size_t nlong,
long *pSync,
int alg);

static inline unsigned int scoll_log2(unsigned long val)
{
Expand Down
5 changes: 3 additions & 2 deletions oshmem/mca/scoll/basic/scoll_basic_module.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2013 Mellanox Technologies, Inc.
* Copyright (c) 2013-2016 Mellanox Technologies, Inc.
* All rights reserved.
* $COPYRIGHT$
*
Expand Down Expand Up @@ -52,9 +52,10 @@ mca_scoll_basic_query(struct oshmem_group_t *group, int *priority)
module->super.scoll_broadcast = mca_scoll_basic_broadcast;
module->super.scoll_collect = mca_scoll_basic_collect;
module->super.scoll_reduce = mca_scoll_basic_reduce;
module->super.scoll_alltoall = mca_scoll_basic_alltoall;
module->super.scoll_module_enable = mca_scoll_basic_enable;
return &(module->super);
}

return NULL ;
return NULL;
}
2 changes: 2 additions & 0 deletions oshmem/mca/scoll/fca/scoll_fca.h
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,8 @@ struct mca_scoll_fca_module_t {
mca_scoll_base_module_t *previous_collect_module;
mca_scoll_base_module_reduce_fn_t previous_reduce;
mca_scoll_base_module_t *previous_reduce_module;
mca_scoll_base_module_alltoall_fn_t previous_alltoall;
mca_scoll_base_module_t *previous_alltoall_module;
};
typedef struct mca_scoll_fca_module_t mca_scoll_fca_module_t;
OBJ_CLASS_DECLARATION(mca_scoll_fca_module_t);
Expand Down
4 changes: 4 additions & 0 deletions oshmem/mca/scoll/fca/scoll_fca_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,6 +391,7 @@ static int _save_coll_handlers(mca_scoll_fca_module_t *fca_module)
FCA_SAVE_PREV_SCOLL_API(broadcast);
FCA_SAVE_PREV_SCOLL_API(collect);
FCA_SAVE_PREV_SCOLL_API(reduce);
FCA_SAVE_PREV_SCOLL_API(alltoall);

return OSHMEM_SUCCESS;
}
Expand Down Expand Up @@ -450,6 +451,7 @@ static void mca_scoll_fca_module_clear(mca_scoll_fca_module_t *fca_module)
fca_module->previous_broadcast = NULL;
fca_module->previous_collect = NULL;
fca_module->previous_reduce = NULL;
fca_module->previous_alltoall = NULL;
}

static void mca_scoll_fca_module_construct(mca_scoll_fca_module_t *fca_module)
Expand All @@ -465,6 +467,7 @@ static void mca_scoll_fca_module_destruct(mca_scoll_fca_module_t *fca_module)
OBJ_RELEASE(fca_module->previous_broadcast_module);
OBJ_RELEASE(fca_module->previous_collect_module);
OBJ_RELEASE(fca_module->previous_reduce_module);
OBJ_RELEASE(fca_module->previous_alltoall_module);
if (fca_module->fca_comm)
_destroy_fca_comm(fca_module);
free(fca_module->local_ranks);
Expand Down Expand Up @@ -541,6 +544,7 @@ mca_scoll_fca_comm_query(struct oshmem_group_t *comm, int *priority)
fca_module->super.scoll_broadcast =
mca_scoll_fca_component.fca_enable_bcast ? mca_scoll_fca_broadcast :
NULL;
fca_module->super.scoll_alltoall = NULL;

*priority = mca_scoll_fca_component.fca_priority;
module = &fca_module->super;
Expand Down
2 changes: 2 additions & 0 deletions oshmem/mca/scoll/mpi/scoll_mpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ struct mca_scoll_mpi_module_t {
mca_scoll_base_module_t *previous_barrier_module;
mca_scoll_base_module_collect_fn_t previous_collect;
mca_scoll_base_module_t *previous_collect_module;
mca_scoll_base_module_alltoall_fn_t previous_alltoall;
mca_scoll_base_module_t *previous_alltoall_module;
};
typedef struct mca_scoll_mpi_module_t mca_scoll_mpi_module_t;

Expand Down
4 changes: 4 additions & 0 deletions oshmem/mca/scoll/mpi/scoll_mpi_module.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ static void mca_scoll_mpi_module_clear(mca_scoll_mpi_module_t *mpi_module)
mpi_module->previous_broadcast = NULL;
mpi_module->previous_reduce = NULL;
mpi_module->previous_collect = NULL;
mpi_module->previous_alltoall = NULL;
}

static void mca_scoll_mpi_module_construct(mca_scoll_mpi_module_t *mpi_module)
Expand All @@ -43,6 +44,7 @@ static void mca_scoll_mpi_module_destruct(mca_scoll_mpi_module_t *mpi_module)
OBJ_RELEASE(mpi_module->previous_broadcast_module);
OBJ_RELEASE(mpi_module->previous_reduce_module);
OBJ_RELEASE(mpi_module->previous_collect_module);
OBJ_RELEASE(mpi_module->previous_alltoall_module);

mca_scoll_mpi_module_clear(mpi_module);
/* Free ompi_comm */
Expand All @@ -68,6 +70,7 @@ static int mca_scoll_mpi_save_coll_handlers(mca_scoll_base_module_t *module, osh
MPI_SAVE_PREV_SCOLL_API(broadcast);
MPI_SAVE_PREV_SCOLL_API(reduce);
MPI_SAVE_PREV_SCOLL_API(collect);
MPI_SAVE_PREV_SCOLL_API(alltoall);
return OSHMEM_SUCCESS;
}

Expand Down Expand Up @@ -173,6 +176,7 @@ mca_scoll_mpi_comm_query(oshmem_group_t *osh_group, int *priority)
mpi_module->super.scoll_broadcast = mca_scoll_mpi_broadcast;
mpi_module->super.scoll_reduce = mca_scoll_mpi_reduce;
mpi_module->super.scoll_collect = mca_scoll_mpi_collect;
mpi_module->super.scoll_alltoall = NULL;

*priority = cm->mpi_priority;
module = &mpi_module->super;
Expand Down
17 changes: 13 additions & 4 deletions oshmem/mca/scoll/scoll.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,6 @@ typedef struct mca_scoll_base_component_1_0_0_t mca_scoll_base_component_t;
typedef int
(*mca_scoll_base_module_enable_1_0_0_fn_t)(struct mca_scoll_base_module_1_0_0_t* module,
struct oshmem_group_t *comm);
typedef int (*mca_scoll_base_module_ft_event_fn_t)(int state);

#define SCOLL_DEFAULT_ALG (-1)

Expand Down Expand Up @@ -139,6 +138,13 @@ typedef int (*mca_scoll_base_module_reduce_fn_t)(struct oshmem_group_t *group,
long *pSync,
void *pWrk,
int alg);
typedef int (*mca_scoll_base_module_alltoall_fn_t)(struct oshmem_group_t *group,
void *target,
const void *source,
ptrdiff_t dst, ptrdiff_t sst,
size_t nlong,
long *pSync,
int alg);

struct mca_scoll_base_module_1_0_0_t {
/** Collective modules all inherit from opal_object */
Expand All @@ -149,13 +155,14 @@ struct mca_scoll_base_module_1_0_0_t {
mca_scoll_base_module_broadcast_fn_t scoll_broadcast;
mca_scoll_base_module_collect_fn_t scoll_collect;
mca_scoll_base_module_reduce_fn_t scoll_reduce;
mca_scoll_base_module_alltoall_fn_t scoll_alltoall;
mca_scoll_base_module_enable_1_0_0_fn_t scoll_module_enable;
};
typedef struct mca_scoll_base_module_1_0_0_t mca_scoll_base_module_1_0_0_t;

/** Per guidence in mca.h, use the unversioned struct name if you just
/** Per guidance in mca.h, use the unversioned struct name if you just
want to always keep up with the most recent version of the
interace. */
interface. */
typedef struct mca_scoll_base_module_1_0_0_t mca_scoll_base_module_t;
OSHMEM_DECLSPEC OBJ_CLASS_DECLARATION(mca_scoll_base_module_t);

Expand All @@ -171,7 +178,7 @@ OSHMEM_DECLSPEC OBJ_CLASS_DECLARATION(mca_scoll_base_module_t);
/*
* Collectives group cache structure
*
* Collectives gorup cache structure, used to find functions to
* Collectives group cache structure, used to find functions to
* implement collective algorithms and their associated modules.
*/
struct mca_scoll_base_group_scoll_t {
Expand All @@ -183,6 +190,8 @@ struct mca_scoll_base_group_scoll_t {
mca_scoll_base_module_1_0_0_t *scoll_collect_module;
mca_scoll_base_module_reduce_fn_t scoll_reduce;
mca_scoll_base_module_1_0_0_t *scoll_reduce_module;
mca_scoll_base_module_alltoall_fn_t scoll_alltoall;
mca_scoll_base_module_1_0_0_t *scoll_alltoall_module;
};
typedef struct mca_scoll_base_group_scoll_t mca_scoll_base_group_scoll_t;

Expand Down

0 comments on commit 50906b3

Please sign in to comment.