SHMEM_PUT8_NBI(3)

πŸ“¦
version 5.0.10 Β· 4 versions
, in ubuntu stonking

πŸ’– SHMEM_PUT8_NBI(3) πŸ’–

like bestie, welcome to the SHMEM_PUT8_NBI page, straight outta the Open MPI manual, section 3 (library calls, iykyk). This is the family of nonblocking put routines, and they are everything. Let's get into it 🫢


🌸 NAME 🌸

The whole girl-gang of nonblocking puts:

  • shmem_putmem_nbi
  • shmem_char_put_nbi
  • shmem_short_put_nbi
  • shmem_int_put_nbi
  • shmem_long_put_nbi
  • shmem_longlong_put_nbi
  • shmem_float_put_nbi
  • shmem_double_put_nbi
  • shmem_longdouble_put_nbi
  • shmem_put8_nbi
  • shmem_put16_nbi
  • shmem_put32_nbi
  • shmem_put64_nbi
  • shmem_put128_nbi

and the vibe of the whole squad is: the nonblocking put routines provide a method for copying data from a contiguous local data object to a data object on a specified PE. ✨


πŸ¦‹ 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 ✨

Bestie, here's the tea β˜•: these routines return right after posting the operation. Like, they do NOT wait around for the vibe to land. The operation is only considered complete after a subsequent call to shmem_quiet. And when shmem_quiet finishes, that's when the data has actually been copied into the dest array on the destination PE. No cap.

Two things you need to know so nothing gets messy:

  • the delivery of data words into the data object on the destination PE may occur in any order πŸ™ˆ
  • and two successive put routines may deliver data out of order unless you slide a call to shmem_fence in between the two calls 🌈

The arguments are as follows:

  • dest β€” the data object being updated on the remote PE. This data object must be remotely accessible. periodt.
  • source β€” the data object holding the data that's getting copied.
  • nelems β€” number of elements in the dest and source arrays. nelems must be of type size_t for C. If you're in Fortran, it has to be a constant, variable, or array element of default integer type.
  • pe β€” PE number of the remote PE. pe must be of type integer. In Fortran, it also has to be a constant, variable, or array element of default integer type.

And one more for the Fortran girlies: if you're 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).


πŸ“ NOTES πŸ“

Go peek at intro_shmem(3) for the definition of the term remotely accessible πŸ‘‘ (it's the lore, you need it).


πŸ“ EXAMPLES πŸ“

okay so consider this simple example for C:

#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:


Copyright 2003-2026, The Open MPI Community

and that's the whole page, bestie πŸ’– this little SHMEM_PUT8_NBI(3) moment was served to you by Open MPI, dated Sep 10, 2026, and yes it ate. go forth and put nonblockingly, mwah πŸ’…βœ¨

πŸ“¦ where this page comes from