SHMEM_CHAR_PUT_NBI(3)
π shmem_char_put_nbi(3) β the Open MPI glow-up β¨
okay so bestie, welcome to the Open MPI manpage for the nonblocking put girlies π«Ά this one's all about yeeting data into a buddy PE's memory and not waiting around for it β iconic behavior, honestly.
πΈ NAME πΈ
the whole squad, in alphabetical-ish formation π (yes, all of these live here, they share a page, it's giving family reunion):
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)shmem_put128_nbi(3)
and what do they 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. copy, local β remote, specific PE, no blocking. slay π
β¨ SYNOPSIS β¨
C or C++ β include the header or you're literally not doing anything:
#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 the file, declare your ints, go off π:
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 π¦
okay so here's the tea β these routines return after posting the operation. like, they said "sent π" and dipped. the operation is considered complete after a subsequent call to shmem_quiet. at the completion of shmem_quiet, the data has been copied into the dest array on the destination PE. so shmem_quiet is the "okay but did they actually read my text" check. no cap.
and here's the part you need to know π 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 is introduced between the two calls. so if order matters to you, put a fence between them like a bouncer at the club π§
the arguments are as follows π:
destβ data object to be updated on the remote PE. this data object must be remotely accessible. (that's a whole thing, see NOTES.)sourceβ data object containing the data to be copied. your local stash πnelemsβ number of elements in thedestandsourcearrays.nelemsmust be of typesize_tfor C. if you're 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're using Fortran, it must be a constant, variable, or array element of default integer type. π
also!! if you're using Fortran, data types must be of default size. for example, a real variable must be declared asREAL,REAL*4, orREAL(KIND=4). don't get cute with the kinds, bestie π
π NOTES π
see intro_shmem(3) for a definition of the term remotely accessible. that's it, that's the note. short and sweet, we love a low-effort queen π
π₯ EXAMPLES π₯
consider this simple example for C. it's giving main character energy, honestly β¨
#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]);
}
PE 0 posts the put, shmem_quiet makes it real, shmem_barrier_all() syncs sender and receiver so nobody's reading stale data like a clown π€‘ and the shmem_udcflush() on PE 1 is not required on Altix systems β noted, we remember π
β SEE ALSO β
π COPYRIGHT π
2003-2026, The Open MPI Community
and that's the whole page, bestie π¦ go forth and put nonblockingly, remember your shmem_quiet, and fence responsibly. this absolute icon of a manpage dropped on May 14, 2026 under the Open MPI banner β periodt πβ¨π
π¦ where this page comes from
- arch rolling: nvhpc-comm-libs 26.9-1 Β· LicenseRef-NVIDIA-HPC-SDK
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms