Skip to content

OSHMEM v1.3: adds fetch and set amos and c11 generic #2123

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
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
210 changes: 202 additions & 8 deletions oshmem/include/pshmem.h

Large diffs are not rendered by default.

28 changes: 18 additions & 10 deletions oshmem/include/pshmemx.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,10 @@ OSHMEM_DECLSPEC void pshmemx_int64_p(int64_t* addr, int64_t value, int pe);
/*
* Block data put routines
*/
OSHMEM_DECLSPEC void pshmemx_put16(void *target, const void *source, size_t len, int pe);

/*
* Strided put routines
*/
OSHMEM_DECLSPEC void pshmemx_iput16(void* target, const void* source, ptrdiff_t tst, ptrdiff_t sst,size_t len, int pe);

/*
* Elemental get routines
Expand All @@ -67,12 +65,10 @@ OSHMEM_DECLSPEC int64_t pshmemx_int64_g(const int64_t* addr, int pe);
/*
* Block data get routines
*/
OSHMEM_DECLSPEC void pshmemx_get16(void *target, const void *source, size_t len, int pe);

/*
* Strided get routines
*/
OSHMEM_DECLSPEC void pshmemx_iget16(void* target, const void* source, ptrdiff_t tst, ptrdiff_t sst,size_t len, int pe);

/*
* Atomic operations
Expand All @@ -81,6 +77,10 @@ OSHMEM_DECLSPEC void pshmemx_iget16(void* target, const void* source, ptrdiff_t
OSHMEM_DECLSPEC int32_t pshmemx_int32_swap(int32_t *target, int32_t value, int pe);
OSHMEM_DECLSPEC int64_t pshmemx_int64_swap(int64_t *target, int64_t value, int pe);

/*Atomic set */
OSHMEM_DECLSPEC void pshmemx_int32_set(int32_t *target, int32_t value, int pe);
OSHMEM_DECLSPEC void pshmemx_int64_set(int64_t *target, int64_t value, int pe);

/* Atomic conditional swap */
OSHMEM_DECLSPEC int32_t pshmemx_int32_cswap(int32_t *target, int32_t cond, int32_t value, int pe);
OSHMEM_DECLSPEC int64_t pshmemx_int64_cswap(int64_t *target, int64_t cond, int64_t value, int pe);
Expand All @@ -89,6 +89,10 @@ OSHMEM_DECLSPEC int64_t pshmemx_int64_cswap(int64_t *target, int64_t cond, int64
OSHMEM_DECLSPEC int32_t pshmemx_int32_fadd(int32_t *target, int32_t value, int pe);
OSHMEM_DECLSPEC int64_t pshmemx_int64_fadd(int64_t *target, int64_t value, int pe);

/* Atomic Fetch */
OSHMEM_DECLSPEC int32_t pshmemx_int32_fetch(const int32_t *target, int pe);
OSHMEM_DECLSPEC int64_t pshmemx_int64_fetch(const int64_t *target, int pe);

/* Atomic Fetch&Inc */
OSHMEM_DECLSPEC int32_t pshmemx_int32_finc(int32_t *target, int pe);
OSHMEM_DECLSPEC int64_t pshmemx_int64_finc(int64_t *target, int pe);
Expand Down Expand Up @@ -148,27 +152,31 @@ OSHMEM_DECLSPEC void pshmemx_int64_prod_to_all(int64_t *target, const int64_t *s
#define pshmem_int32_p pshmemx_int32_p
#define pshmem_int64_p pshmemx_int64_p

#define pshmem_put16 pshmemx_put16
#define pshmem_iput16 pshmemx_iput16

#define pshmem_int16_g pshmemx_int16_g
#define pshmem_int32_g pshmemx_int32_g
#define pshmem_int64_g pshmemx_int64_g

#define pshmem_get16 pshmemx_get16
#define pshmem_iget16 pshmemx_iget16

#define pshmem_int32_swap pshmemx_int32_swap
#define pshmem_int64_swap pshmemx_int64_swap

#define pshmem_int32_set pshmemx_int32_set
#define pshmem_int64_set pshmemx_int64_set

#define pshmem_int32_cswap pshmemx_int32_cswap
#define pshmem_int64_cswap pshmemx_int64_cswap

#define pshmem_int32_fadd pshmemx_int32_fadd
#define pshmem_int64_fadd pshmemx_int64_fadd

#define pshmem_int32_fetch pshmemx_int32_fetch
#define pshmem_int64_fetch pshmemx_int64_fetch

#define pshmem_int32_finc pshmemx_int32_finc
#define pshmem_int64_finc pshmemx_int64_finc

#define pshmem_int32_add pshmemx_int32_add
#define pshmem_int64_add pshmemx_int64_add

#define pshmem_int32_inc pshmemx_int32_inc
#define pshmem_int64_inc pshmemx_int64_inc

Expand Down
211 changes: 204 additions & 7 deletions oshmem/include/shmem.h.in

Large diffs are not rendered by default.

27 changes: 17 additions & 10 deletions oshmem/include/shmemx.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,10 @@ OSHMEM_DECLSPEC void shmemx_int64_p(int64_t* addr, int64_t value, int pe);
/*
* Block data put routines
*/
OSHMEM_DECLSPEC void shmemx_put16(void *target, const void *source, size_t len, int pe);

/*
* Strided put routines
*/
OSHMEM_DECLSPEC void shmemx_iput16(void* target, const void* source, ptrdiff_t tst, ptrdiff_t sst,size_t len, int pe);

/*
* Elemental get routines
Expand All @@ -52,12 +50,10 @@ OSHMEM_DECLSPEC int64_t shmemx_int64_g(const int64_t* addr, int pe);
/*
* Block data get routines
*/
OSHMEM_DECLSPEC void shmemx_get16(void *target, const void *source, size_t len, int pe);

/*
* Strided get routines
*/
OSHMEM_DECLSPEC void shmemx_iget16(void* target, const void* source, ptrdiff_t tst, ptrdiff_t sst,size_t len, int pe);

/*
* Atomic operations
Expand All @@ -66,6 +62,10 @@ OSHMEM_DECLSPEC void shmemx_iget16(void* target, const void* source, ptrdiff_t t
OSHMEM_DECLSPEC int32_t shmemx_int32_swap(int32_t *target, int32_t value, int pe);
OSHMEM_DECLSPEC int64_t shmemx_int64_swap(int64_t *target, int64_t value, int pe);

/* Atomic set */
OSHMEM_DECLSPEC void shmemx_int32_set(int32_t *target, int32_t value, int pe);
OSHMEM_DECLSPEC void shmemx_int64_set(int64_t *target, int64_t value, int pe);

/* Atomic conditional swap */
OSHMEM_DECLSPEC int32_t shmemx_int32_cswap(int32_t *target, int32_t cond, int32_t value, int pe);
OSHMEM_DECLSPEC int64_t shmemx_int64_cswap(int64_t *target, int64_t cond, int64_t value, int pe);
Expand All @@ -74,6 +74,10 @@ OSHMEM_DECLSPEC int64_t shmemx_int64_cswap(int64_t *target, int64_t cond, int64_
OSHMEM_DECLSPEC int32_t shmemx_int32_fadd(int32_t *target, int32_t value, int pe);
OSHMEM_DECLSPEC int64_t shmemx_int64_fadd(int64_t *target, int64_t value, int pe);

/* Atomic Fetch */
OSHMEM_DECLSPEC int32_t shmemx_int32_fetch(const int32_t *target, int pe);
OSHMEM_DECLSPEC int64_t shmemx_int64_fetch(const int64_t *target, int pe);

/* Atomic Fetch&Inc */
OSHMEM_DECLSPEC int32_t shmemx_int32_finc(int32_t *target, int pe);
OSHMEM_DECLSPEC int64_t shmemx_int64_finc(int64_t *target, int pe);
Expand Down Expand Up @@ -133,25 +137,28 @@ OSHMEM_DECLSPEC void shmemx_int64_prod_to_all(int64_t *target, const int64_t *so
#define shmem_int32_p shmemx_int32_p
#define shmem_int64_p shmemx_int64_p

#define shmem_put16 shmemx_put16
#define shmem_iput16 shmemx_iput16

#define shmem_int16_g shmemx_int16_g
#define shmem_int32_g shmemx_int32_g
#define shmem_int64_g shmemx_int64_g

#define shmem_get16 shmemx_get16
#define shmem_iget16 shmemx_iget16

#define shmem_int32_swap shmemx_int32_swap
#define shmem_int64_swap shmemx_int64_swap

#define shmem_int32_set shmemx_int32_set
#define shmem_int64_set shmemx_int64_set

#define shmem_int32_cswap shmemx_int32_cswap
#define shmem_int64_cswap shmemx_int64_cswap

#define shmem_int32_fadd shmemx_int32_fadd
#define shmem_int64_fadd shmemx_int64_fadd

#define shmem_int32_fetch shmemx_int32_fetch
#define shmem_int64_fetch shmemx_int64_fetch

#define shmem_int32_finc shmemx_int32_finc
#define shmem_int64_finc shmemx_int64_finc

#define shmem_int32_add shmemx_int32_add
#define shmem_int64_add shmemx_int64_add
#define shmem_int32_inc shmemx_int32_inc
Expand Down
2 changes: 2 additions & 0 deletions oshmem/shmem/c/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,10 @@ OSHMEM_API_SOURCES = \
shmem_clear_cache_line_inv.c \
shmem_reduce.c \
shmem_swap.c \
shmem_set.c \
shmem_cswap.c \
shmem_fadd.c \
shmem_fetch.c \
shmem_finc.c \
shmem_add.c \
shmem_inc.c \
Expand Down
2 changes: 2 additions & 0 deletions oshmem/shmem/c/profile/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,10 @@ OSHMEM_API_SOURCES = \
pshmem_clear_cache_line_inv.c \
pshmem_reduce.c \
pshmem_swap.c \
pshmem_set.c \
pshmem_cswap.c \
pshmem_fadd.c \
pshmem_fetch.c \
pshmem_finc.c \
pshmem_add.c \
pshmem_inc.c \
Expand Down
40 changes: 33 additions & 7 deletions oshmem/shmem/c/profile/defines.h
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,9 @@
#define shmem_double_put pshmem_double_put
#define shmem_longlong_put pshmem_longlong_put
#define shmem_longdouble_put pshmem_longdouble_put
#define shmemx_put16 pshmemx_put16

#define shmem_put8 pshmem_put8
#define shmem_put16 pshmem_put16
#define shmem_put32 pshmem_put32
#define shmem_put64 pshmem_put64
#define shmem_put128 pshmem_put128
Expand All @@ -95,14 +97,17 @@
/*
* Strided put routines
*/
#define shmem_int_iput pshmem_int_iput
#define shmem_char_iput pshmem_char_iput
#define shmem_short_iput pshmem_short_iput
#define shmem_int_iput pshmem_int_iput
#define shmem_float_iput pshmem_float_iput
#define shmem_double_iput pshmem_double_iput
#define shmem_longlong_iput pshmem_longlong_iput
#define shmem_longdouble_iput pshmem_longdouble_iput
#define shmem_long_iput pshmem_long_iput
#define shmemx_iput16 pshmemx_iput16

#define shmem_iput8 pshmem_iput8
#define shmem_iput16 pshmem_iput16
#define shmem_iput32 pshmem_iput32
#define shmem_iput64 pshmem_iput64
#define shmem_iput128 pshmem_iput128
Expand Down Expand Up @@ -151,7 +156,9 @@
#define shmem_double_get pshmem_double_get
#define shmem_longlong_get pshmem_longlong_get
#define shmem_longdouble_get pshmem_longdouble_get
#define shmemx_get16 pshmemx_get16

#define shmem_get8 pshmem_get8
#define shmem_get16 pshmem_get16
#define shmem_get32 pshmem_get32
#define shmem_get64 pshmem_get64
#define shmem_get128 pshmem_get128
Expand All @@ -160,14 +167,17 @@
/*
* Strided get routines
*/
#define shmem_int_iget pshmem_int_iget
#define shmem_char_iget pshmem_char_iget
#define shmem_short_iget pshmem_short_iget
#define shmem_int_iget pshmem_int_iget
#define shmem_float_iget pshmem_float_iget
#define shmem_double_iget pshmem_double_iget
#define shmem_longlong_iget pshmem_longlong_iget
#define shmem_longdouble_iget pshmem_longdouble_iget
#define shmem_long_iget pshmem_long_iget
#define shmemx_iget16 pshmemx_iget16

#define shmem_iget8 pshmem_iget8
#define shmem_iget16 pshmem_iget16
#define shmem_iget32 pshmem_iget32
#define shmem_iget64 pshmem_iget64
#define shmem_iget128 pshmem_iget128
Expand All @@ -194,7 +204,6 @@
* Atomic operations
*/
/* Atomic swap */
#define shmem_swap pshmem_swap
#define shmem_double_swap pshmem_double_swap
#define shmem_float_swap pshmem_float_swap
#define shmem_int_swap pshmem_int_swap
Expand All @@ -203,6 +212,14 @@
#define shmemx_int32_swap pshmemx_int32_swap
#define shmemx_int64_swap pshmemx_int64_swap

/* Atomic set */
#define shmem_double_set pshmem_double_set
#define shmem_float_set pshmem_float_set
#define shmem_int_set pshmem_int_set
#define shmem_long_set pshmem_long_set
#define shmem_longlong_set pshmem_longlong_set
#define shmemx_int32_set pshmemx_int32_set
#define shmemx_int64_set pshmemx_int64_set

/* Atomic conditional swap */
#define shmem_int_cswap pshmem_int_cswap
Expand All @@ -219,6 +236,15 @@
#define shmemx_int32_fadd pshmemx_int32_fadd
#define shmemx_int64_fadd pshmemx_int64_fadd

/* Atomic Fetch */
#define shmem_double_fetch pshmem_double_fetch
#define shmem_float_fetch pshmem_float_fetch
#define shmem_int_fetch pshmem_int_fetch
#define shmem_long_fetch pshmem_long_fetch
#define shmem_longlong_fetch pshmem_longlong_fetch
#define shmemx_int32_fetch pshmemx_int32_fetch
#define shmemx_int64_fetch pshmemx_int64_fetch

/* Atomic Fetch&Inc */
#define shmem_int_finc pshmem_int_finc
#define shmem_long_finc pshmem_long_finc
Expand Down
71 changes: 71 additions & 0 deletions oshmem/shmem/c/shmem_fetch.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* Copyright (c) 2016 Mellanox Technologies, Inc.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "oshmem_config.h"

#include "oshmem/constants.h"
#include "oshmem/include/shmem.h"

#include "oshmem/runtime/runtime.h"

#include "oshmem/op/op.h"
#include "oshmem/mca/atomic/atomic.h"

/*
* These routines perform an atomic fetch operation.
* The fetch routines retrieve the value at address target on PE pe.
* The operation must be completed without the possibility of another process
* updating target during the fetch.
*/
#define SHMEM_TYPE_FETCH(type_name, type, prefix) \
type prefix##type_name##_fetch(const type *target, int pe) \
{ \
int rc = OSHMEM_SUCCESS; \
size_t size = 0; \
type out_value; \
type value = 0; \
oshmem_op_t* op = oshmem_op_sum##type_name; \
\
RUNTIME_CHECK_INIT(); \
RUNTIME_CHECK_PE(pe); \
RUNTIME_CHECK_ADDR(target); \
\
size = sizeof(out_value); \
rc = MCA_ATOMIC_CALL(fadd( \
(void*)target, \
(void*)&out_value, \
(const void*)&value, \
size, \
pe, \
op)); \
RUNTIME_CHECK_RC(rc); \
\
return out_value; \
}

#if OSHMEM_PROFILING
#include "oshmem/include/pshmem.h"
#pragma weak shmem_int_fetch = pshmem_int_fetch
#pragma weak shmem_long_fetch = pshmem_long_fetch
#pragma weak shmem_longlong_fetch = pshmem_longlong_fetch
#pragma weak shmem_double_fetch = pshmem_double_fetch
#pragma weak shmem_float_fetch = pshmem_float_fetch
#pragma weak shmemx_int32_fetch = pshmemx_int32_fetch
#pragma weak shmemx_int64_fetch = pshmemx_int64_fetch
#include "oshmem/shmem/c/profile/defines.h"
#endif

SHMEM_TYPE_FETCH(_int, int, shmem)
SHMEM_TYPE_FETCH(_long, long, shmem)
SHMEM_TYPE_FETCH(_longlong, long long, shmem)
SHMEM_TYPE_FETCH(_double, double, shmem)
SHMEM_TYPE_FETCH(_float, float, shmem)
SHMEM_TYPE_FETCH(_int32, int32_t, shmemx)
SHMEM_TYPE_FETCH(_int64, int64_t, shmemx)

7 changes: 4 additions & 3 deletions oshmem/shmem/c/shmem_get.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@
#pragma weak shmem_double_get = pshmem_double_get
#pragma weak shmem_longdouble_get = pshmem_longdouble_get
#pragma weak shmem_getmem = pshmem_getmem
#pragma weak shmemx_get16 = pshmemx_get16
#pragma weak shmem_get8 = pshmem_get8
#pragma weak shmem_get16 = pshmem_get16
#pragma weak shmem_get32 = pshmem_get32
#pragma weak shmem_get64 = pshmem_get64
#pragma weak shmem_get128 = pshmem_get128
Expand Down Expand Up @@ -92,9 +93,9 @@ SHMEM_TYPE_GET(_longdouble, long double)
}

SHMEM_TYPE_GETMEM(_getmem, 1, shmem)
SHMEM_TYPE_GETMEM(_get16, 2, shmemx)
SHMEM_TYPE_GETMEM(_get8, 1, shmem)
SHMEM_TYPE_GETMEM(_get16, 2, shmem)
SHMEM_TYPE_GETMEM(_get32, 4, shmem)
SHMEM_TYPE_GETMEM(_get64, 8, shmem)
SHMEM_TYPE_GETMEM(_get128, 16, shmem)

SHMEM_TYPE_GETMEM(_get, sizeof(long), shmem)
Loading