SHMEM_GET_NBI(3)

πŸ’– SHMEM_GET_NBI(3) β€” the Open MPI nonblocking get era πŸ’–

okay bestie, welcome to the Open MPI manual page for SHMEM_GET_NBI(3). This is literally the group chat for the nonblocking get squad: copy data from a remote PE, post the operation, and let shmem_quiet handle the delivery. No cap, it’s giving β€œremote data but make it async” energy. πŸ¦‹

✨ NAME ✨

Meet the whole squad: shmem_getmem_nbi(3), shmem_char_get_nbi(3), shmem_short_get_nbi(3), shmem_int_get_nbi(3), shmem_long_get_nbi(3), shmem_longlong_get_nbi(3), shmem_float_get_nbi(3), shmem_double_get_nbi(3), shmem_longdouble_get_nbi(3), shmem_get8_nbi(3), shmem_get16_nbi(3), shmem_get32_nbi(3), shmem_get64_nbi(3), and shmem_get128_nbi(3).

And the main character description is: the nonblocking get routines provide a method for copying data from a contiguous remote data object on the specified PE to the local data object. πŸ’…

🌸 SYNOPSIS 🌸

here’s the synopsis exactly as the page gives it β€” code is verbatim, bestie:

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);

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 πŸ’œ

The get routines provide a method for copying a contiguous symmetric data object from a different PE to a contiguous data object on the local PE. The routines return after posting the operation. The operation is considered complete after a subsequent call to shmem_quiet. At the completion of shmem_quiet, the data has been delivered to the dest array on the local PE. 🫢

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). ✨

🧚 NOTES 🧚

See intro_shmem(3) for a definition of the term remotely accessible. That’s the whole note, bestie β€” brief and iconic. πŸ‘‘

πŸ”₯ 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

🌈 SEE ALSO 🌈


mwah πŸ’‹ source/version: gitclone, Unreleased developer copy β€” that’s the footer energy, and it ate. πŸŽ€

πŸ“¦ 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