SHMEM_PUT64_NBI(3)

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

✨ SHMEM_PUT64_NBI β€” the Open MPI nonblocking put saga πŸ’…

hi bestie 🫢 welcome to SHMEM_PUT64_NBI(3), a page from the Open MPI collection, and honestly? it's a whole family reunion up in here. this one's about the nonblocking put routines β€” they copy data from a contiguous local data object over to a data object on a specified PE, no cap πŸ¦‹

the squad (all of them have their own (3) page, iykyk):

and what do they all do? they copy data from a contiguous local data object to a data object on a specified PE. that's the vibe. periodt πŸ’–


🌸 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)
⚠️ not me pointing out that the C prototypes above are written exactly like the original page has them β€” copy them character for character, don't go "fixing" anything, okay? πŸ™ˆ

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

okay so here's the tea β˜• these routines return after posting the operation. that's it. that's the whole personality. 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.

and now the part you really need to know, bestie, because it's giving chaos:

  • 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 like... it's not ordered unless you make it ordered. no cap.

πŸŽ€ the arguments πŸŽ€

  • dest β€” the data object to be updated on the remote PE. this data object must be remotely accessible. (yes queen, it has to be reachable, we don't do local-only here.)
  • source β€” the data object containing the data to be copied. the origin story, if you will ✨
  • nelems β€” number of elements in the dest and source arrays. nelems must be of type size_t for 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. pe must be of type integer. if you're using Fortran, it must be a constant, variable, or array element of default integer type.
🫢 Fortran besties listen up: 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 be out here with the fancy sizes, that's not the moment.

πŸ¦‹ NOTES πŸ¦‹

  • see intro_shmem(3) for a definition of the term remotely accessible. because yes, it's a whole concept and it has its own page. iconic behavior honestly πŸ‘‘

🌈 EXAMPLES 🌈

consider this simple example for C. it's cute, it's little, it eats πŸ’…

#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, bestie πŸ“


2003-2026, The Open MPI Community


and that's the page!! tysm for reading my little manual moment 🧚 this was Open MPI's SHMEM_PUT64_NBI(3), dated Sep 10, 2026, and honestly? slay. go forth and shmem_quiet() before you read that dest array, or you WILL be humbled πŸ’€πŸ’–

πŸ“¦ where this page comes from