SHMEM_DOUBLE_PUT_NBI(3)
π SHMEM_DOUBLE_PUT_NBI(3) β the Open MPI girlies' guide to nonblocking puts π
okay so bestie. welcome. this is the Open MPI manual page for the nonblocking put family, and it's genuinely one of the most useful things in SHMEM, no cap. π¦
The stars of the show are: shmem_putmem_nbi(3), shmem_char_put_nbi(3), shmem_short_put_nbi(3), shmem_int_put_nbi(3), shmem_long_put_nbi(3), shmem_longlong_put_nbi(3), shmem_float_put_nbi(3), shmem_double_put_nbi(3), shmem_longdouble_put_nbi(3), shmem_put8_nbi(3), shmem_put16_nbi(3), shmem_put32_nbi(3), shmem_put64_nbi(3), and shmem_put128_nbi(3).
And what do they all do?? The nonblocking put routines provide a method for copying data from a contiguous local data object to a data object on a specified PE. that's the whole vibe. β¨
β¨ SYNOPSIS β¨
π©· C or C++
#include <mpp/shmem.h>
void shmem_putmem_nbi(void *dest, const void *source,
size_t nelems, int pe)
void shmem_char_put(char *dest, const char *source,
size_t nelems, int pe)
void shmem_short_put(short *dest, const short *source,
size_t nelems, int pe)
void shmem_int_put(int *dest, const int *source,
size_t nelems, int pe)
void shmem_long_put(long *dest, const long *source,
size_t nelems, int pe)
void shmem_longlong_put(long long *dest, const long long *source,
size_t nelems, int pe)
void shmem_float_put(float *dest, const float *source,
size_t nelems, int pe)
void shmem_double_put(double *dest, const double *source,
size_t nelems, int pe)
void shmem_longdouble_put(long double *dest, const long double *source,
size_t nelems, int pe)
void shmem_put8(void *dest, const void *source,
size_t nelems, int pe)
void shmem_put16(void *dest, const void *source,
size_t nelems, int pe)
void shmem_put32(void *dest, const void *source,
size_t nelems, int pe)
void shmem_put64(void *dest, const void *source,
size_t nelems, int pe)
void shmem_put128(void *dest, const void *source,
size_t nelems, int pe)
π©΅ Fortran
INCLUDE "mpp/shmem.fh"
INTEGER nelems, pe
CALL SHMEM_PUTMEM_NBI(dest, source, nelems, pe)
CALL SHMEM_CHARACTER_PUT_NBI(dest, source, nelems, pe)
CALL SHMEM_COMPLEX_PUT_NBI(dest, source, nelems, pe)
CALL SHMEM_DOUBLE_PUT_NBI(dest, source, nelems, pe)
CALL SHMEM_INTEGER_PUT_NBI(dest, source, nelems, pe)
CALL SHMEM_LOGICAL_PUT_NBI(dest, source, nelems, pe)
CALL SHMEM_REAL_PUT_NBI(dest, source, nelems, pe)
CALL SHMEM_PUT4_NBI(dest, source, nelems, pe)
CALL SHMEM_PUT8_NBI(dest, source, nelems, pe)
CALL SHMEM_PUT32_NBI(dest, source, nelems, pe)
CALL SHMEM_PUT64_NBI(dest, source, nelems, pe)
CALL SHMEM_PUT128_NBI(dest, source, nelems, pe)
πΈ DESCRIPTION πΈ
The routines return after posting the operation. Periodt. π
The operation is considered complete after a subsequent call to shmem_quiet(3). Like β that's when you know it landed. At the completion of shmem_quiet(3), the data has been copied into the dest array on the destination PE. π«Ά
β οΈ and this is the part everyone skips and then gets confused: the delivery of data words into the data object on the destination PE may occur in any order. Furthermore, two successive put routines may deliver data out of order unless a call to shmem_fence(3) is introduced between the two calls. so if you're out here assuming order without a fence... bestie no π
The arguments are as follows:
destβ Data object to be updated on the remote PE. This data object must be remotely accessible. (yes. that's a whole term. it has a definition. keep reading. π)sourceβ Data object containing the data to be copied.nelemsβ Number of elements in thedestandsourcearrays.nelemsmust be of typesize_tfor C. If you are using Fortran, it must be a constant, variable, or array element of default integer type.peβ PE number of the remote PE.pemust be of typeinteger. If you are using Fortran, it must be a constant, variable, or array element of default integer type.
If you are using Fortran, data types must be of default size. For example, a real variable must be declared as REAL, REAL*4, or REAL(KIND=4). β¨ don't get cute with it.
π NOTES π
See intro_shmem(3) for a definition of the term remotely accessible. iykyk. π
π EXAMPLES π
Consider this simple example for C. it's giving classic, it's giving tutorial-core, and honestly? we love her for it.
#include <stdio.h>
#include <mpp/shmem.h>
main()
{
long source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
static long target[10];
shmem_init();
if (shmem_my_pe() == 0) {
/* put 10 words into target on PE 1 */
shmem_long_put_nbi(target, source, 10, 1);
shmem_quiet();
}
shmem_barrier_all(); /* sync sender and receiver */
if (shmem_my_pe() == 1)
shmem_udcflush(); /* not required on Altix systems */
printf("target[0] on PE %d is %d\n", shmem_my_pe(), target[0]);
}
See also: intro_shmem(3) shmem_quiet(3)
π Copyright π
2003-2026, The Open MPI Community
and that's the whole page, bestie π go forth, put nonblockingly, call your shmem_quiet(3), and slay. this was the Open MPI manual, SHMEM_DOUBLE_PUT_NBI(3), dated Sep 10, 2026. mwah πβ¨
π¦ where this page comes from
- ubuntu stonking: openmpi-doc 5.0.10-6 Β· other
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms