SHMEM_INT_GET_NBI(3)

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

πŸ’– SHMEM_INT_GET_NBI πŸ’–

okay so bestie, we're in the Open MPI corner of the manual and this is the page for SHMEM_INT_GET_NBI(3) and its whole glow-up squad of nonblocking get routines. if you've ever been like "i want the data from that PE over there but i do NOT want to sit around waiting for it" β€” hi, this is the page for you 🫢


🌸 NAME 🌸

like. the whole point. the entire assignment. copied to the local data object, no waiting. iconic ✨


✨ SYNOPSIS ✨

C or C++

#include <mpp/shmem.h>

void shmem_getmem_nbi(void *dest, const void *source,
  size_t nelems, int pe)

void shmem_char_get(char *dest, const char *source,
  size_t nelems, int pe)

void shmem_short_get(short *dest, const short *source,
  size_t nelems, int pe)

void shmem_int_get(int *dest, const int *source,
  size_t nelems, int pe)

void shmem_long_get(long *dest, const long *source,
  size_t nelems, int pe)

void shmem_longlong_get(long long *dest, const long long *source,
  size_t nelems, int pe)

void shmem_float_get(float *dest, const float *source,
  size_t nelems, int pe)

void shmem_double_get(double *dest, const double *source,
  size_t nelems, int pe)

void shmem_longdouble_get(long double *dest, const long double *source,
  size_t nelems, int pe)

void shmem_get8(void *dest, const void *source,
  size_t nelems, int pe)

void shmem_get16(void *dest, const void *source,
  size_t nelems, int pe)

void shmem_get32(void *dest, const void *source,
  size_t nelems, int pe)

void shmem_get64(void *dest, const void *source,
  size_t nelems, int pe)

void shmem_get128(void *dest, const void *source,
  size_t nelems, int pe)
not me noticing the C prototypes above say shmem_char_get, shmem_short_get, shmem_int_get etc.?? yeah. that's literally what's on the page, so that's literally what's on this page. copying the source material exactly is the vibe, no cap πŸ’…

Fortran

INCLUDE "mpp/shmem.fh"

INTEGER nelems, pe

CALL SHMEM_GETMEM_NBI(dest, source, nelems, pe)

CALL SHMEM_CHARACTER_GET_NBI(dest, source, nelems, pe)

CALL SHMEM_COMPLEX_GET_NBI(dest, source, nelems, pe)

CALL SHMEM_DOUBLE_GET_NBI(dest, source, nelems, pe)

CALL SHMEM_INTEGER_GET_NBI(dest, source, nelems, pe)

CALL SHMEM_LOGICAL_GET_NBI(dest, source, nelems, pe)

CALL SHMEM_REAL_GET_NBI(dest, source, nelems, pe)

CALL SHMEM_GET4_NBI(dest, source, nelems, pe)

CALL SHMEM_GET8_NBI(dest, source, nelems, pe)

CALL SHMEM_GET32_NBI(dest, source, nelems, pe)

CALL SHMEM_GET64_NBI(dest, source, nelems, pe)

CALL SHMEM_GET128_NBI(dest, source, nelems, pe)

πŸ¦‹ DESCRIPTION πŸ¦‹

so the get routines give you a whole method for copying a contiguous symmetric data object from a different PE onto a contiguous data object on the local PE. and here's the nonblocking part, the part that makes it the moment: these routines return after posting the operation. that's it. they hand in the homework and walk away. 😌

the operation is considered complete after a subsequent call to shmem_quiet. and at the completion of shmem_quiet, the data has been delivered to the dest array on the local PE. so like β€” posting is not finishing. shmem_quiet is the "okay are we actually done tho" check. remember that. fr fr.

The arguments are as follows:

  • dest β€” Local data object to be updated.
  • source β€” Data object on the PE identified by pe that contains the data to be copied. This data object must be remotely accessible.
  • nelems β€” Number of elements in the target and source arrays. len must be of type integer. 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. pe must be of type integer. 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). no fancy sizes bestie, default size only 🌸


πŸŽ€ NOTES πŸŽ€

  • See intro_shmem(3) for a definition of the term remotely accessible. (yes we keep saying it, yes it has an actual definition, yes you should go read it 🫢)

🌈 EXAMPLES 🌈

Consider this simple example for Fortran.

PROGRAM REDUCTION
  REAL VALUES, SUM
  COMMON /C/ VALUES
  REAL WORK

  CALL START_PES(0) ! ALLOW ANY NUMBER OF PES
  VALUES = MY_PE() ! INITIALIZE IT TO SOMETHING
  CALL SHMEM_BARRIER_ALL
  SUM = 0.0
  DO I = 0,NUM_PES()-1
    CALL SHMEM_REAL_GET_NBI(WORK, VALUES, 1, I)
    CALL SHMEM_QUIET                ! wait for delivery
    SUM = SUM + WORK
  ENDDO
  PRINT *, 'PE ', MY_PE(), ' COMPUTED SUM=', SUM
  CALL SHMEM_BARRIER_ALL
END

look at that little CALL SHMEM_QUIET sitting right there after the nonblocking get. the way that it literally spells out "wait for delivery" for you. main character energy honestly πŸ‘‘

See also:

intro_shmem(3) shmem_quiet(3)

2003-2026, The Open MPI Community

and that's the whole page babe πŸ’– this was SHMEM_INT_GET_NBI(3) from Open MPI, dated Sep 10, 2026, copyright 2003-2026, The Open MPI Community. go post your gets, go call your shmem_quiet, and go be remotely accessible (consensually). periodt. πŸ’…βœ¨πŸ¦‹

πŸ“¦ where this page comes from