SHMEM_DOUBLE_IPUT(3)

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

πŸ¦‹ SHMEM_DOUBLE_IPUT(3) β€” the Open MPI iput family πŸ¦‹

okay so bestie, welcome to the Open MPI man page for SHMEM_DOUBLE_IPUT(3), aka the glow-up edition ✨. This one is about the whole shmem_iput squad β€” strided writes, remote PEs, the works. Sit down, hydrate, let's go πŸ’–


✨ NAME ✨

The full iput girlie squad, all on one page. Like, every single one of these is documented here, and they all do the exact same vibe:

And what do they do, collectively, as a unit? Transfer strided data to a specified processing element (PE). periodt. 🫢


πŸ“œ SYNOPSIS πŸ“œ

πŸ’… C or C++

#include <mpp/shmem.h>

void shmem_double_iput(double *target, const double *source,
  ptrdiff_t tst, ptrdiff_t sst, size_t len, int pe)

void shmem_float_iput(float *target, const float *source,
  ptrdiff_t tst, ptrdiff_t sst, size_t len, int pe)

void shmem_int_iput(int *target, const int *source,
  ptrdiff_t tst, ptrdiff_t sst, size_t len, int pe)

void shmem_iput32(void *target, const void *source,
  ptrdiff_t tst, ptrdiff_t sst, size_t len, int pe)

void shmem_iput64(void *target, const void *source,
  ptrdiff_t tst, ptrdiff_t sst, size_t len, int pe)

void shmem_iput128(void *target, const void *source,
  ptrdiff_t tst, ptrdiff_t sst, size_t len, int pe)

void shmem_long_iput(long *target, const long *source,
  ptrdiff_t tst, ptrdiff_t sst, size_t len, int pe)

void shmem_longdouble_iput(long double *target,
  const long double *source, ptrdiff_t tst, ptrdiff_t sst,
  size_t len, int pe)

void shmem_longlong_iput(long long *target,
  const long long *source, ptrdiff_t tst, ptrdiff_t sst,
  size_t len, int pe)

void shmem_short_iput(short *target, const short *source,
  ptrdiff_t tst, ptrdiff_t sst, size_t len, int pe)

🧚 Fortran

INCLUDE "mpp/shmem.fh"

INTEGER tst, sst, len, pe

CALL SHMEM_COMPLEX_IPUT(target, source, tst, sst, len,
& pe)

CALL SHMEM_DOUBLE_IPUT(target, source, tst, sst, len,
& pe)

CALL SHMEM_INTEGER_IPUT(target, source, tst, sst, len,
& pe)

CALL SHMEM_IPUT4(target, source, tst, sst, len, pe)

CALL SHMEM_IPUT8(target, source, tst, sst, len, pe)

CALL SHMEM_IPUT32(target, source, tst, sst, len, pe)

CALL SHMEM_IPUT64(target, source, tst, sst, len, pe)

CALL SHMEM_IPUT128(target, source, tst, sst, len, pe)

CALL SHMEM_LOGICAL_IPUT(target, source, tst, sst, len,
& pe)

CALL SHMEM_REAL_IPUT(target, source, tst, sst, len, pe)

🌸 DESCRIPTION 🌸

okay so here's the tea πŸ“: the shmem_iput routines read the elements of a local array (source) and write them to a remote array (target) on the PE indicated by pe.

⚠️ Big important caveat, bestie, do NOT skim this one: These routines return when the data has been copied out of the source array on the local PE β€” but not necessarily before the data has been delivered to the remote data object. She's asynchronous like that. πŸ’€

πŸŽ€ The arguments

  • target β€” the array to be updated on the remote PE. This data object must be remotely accessible. Non-negotiable, queen.
  • source β€” the array containing the data to be copied. That's the local one, the one you already have.
  • tst β€” the stride between consecutive elements of the target array. The stride is scaled by the element size of the target array. A value of 1 indicates contiguous data. tst must be of type integer. If you are using Fortran, it must be a default integer value. mmm, strides.
  • sst β€” the stride between consecutive elements of the source array. The stride is scaled by the element size of the source array. A value of 1 indicates contiguous data. sst must be of type integer. If you are using Fortran, it must be a default integer value. twin but make it source 🫢
  • len β€” 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.

πŸ‘‘ Typing constraints (the target and source data objects MUST conform)

  • shmem_iput32, shmem_iput4: Any noncharacter type that has a storage size equal to 32 bits.
  • shmem_iput64, shmem_iput8: Any noncharacter type that has a storage size equal to 64 bits.
  • shmem_iput128: Any noncharacter type that has a storage size equal to 128 bits.
  • shmem_short_iput: Elements of type short.
  • shmem_int_iput: Elements of type int.
  • shmem_long_iput: Elements of type long.
  • shmem_longlong_iput: Elements of type long long.
  • shmem_float_iput: Elements of type float.
  • shmem_double_iput: Elements of type double.
  • shmem_longdouble_iput: Elements of type long double.
  • SHMEM_COMPLEX_IPUT: Elements of type complex of default size.
  • SHMEM_DOUBLE_IPUT: (Fortran) Elements of type double precision.
  • SHMEM_INTEGER_IPUT: Elements of type integer.
  • SHMEM_LOGICAL_IPUT: Elements of type logical.
  • SHMEM_REAL_IPUT: Elements of type real.
  • SHMEM_LOGICAL_IPUT: Elements of type logical.
  • SHMEM_REAL_IPUT: Elements of type real.

yes bestie, SHMEM_LOGICAL_IPUT and SHMEM_REAL_IPUT are listed twice on the page. that's literally what the original says, so I'm keeping it. she said it twice and she meant it πŸ’…βœ¨

And one more thing β€” 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 sneaky double-width vibes, okay? πŸ™ˆ


πŸ“ NOTES πŸ“

See intro_shmem(3) for a definition of the term remotely accessible. yw 🫢


🌈 EXAMPLES 🌈

Consider the following simple shmem_long_iput example for C/C++ programs. (Yes, it says long, and it uses short. We're just built different. 😭)

#include <mpp/shmem.h>

main()
{
  short source[10] = { 1, 2, 3, 4, 5,
  6, 7, 8, 9, 10 };
  static short target[10];

  shmem_init();
  if (shmem_my_pe() == 0) {
    /* put 10 words into target on PE 1 */
    shmem_short_iput(target, source, 1, 2, 5, 1);
  }
  shmem_barrier_all(); /* sync sender and receiver */
  if (shmem_my_pe() == 1) {
    shmem_udcflush(); /* not required on IRIX systems */
    printf("target on PE %d is %d %d %d %d %d0, shmem_my_pe(),
    (int)target[0], (int)target[1], (int)target[2],
    (int)target[3], (int)target[4] );
  }
  shmem_barrier_all(); /* sync before exiting */
}

literally copied verbatim, character for character, I do not make the rules πŸ”₯

πŸ¦‹ See also


2003-2026, The Open MPI Community


and that's the whole page, bestie πŸ’œ β€” this was Open MPI's SHMEM_DOUBLE_IPUT(3), dated Sep 10, 2026, and look at her, she ate. go forth and stride responsibly. πŸŽ€βœ¨πŸ‘‘

πŸ“¦ where this page comes from