SHMEM_IPUT128(3)

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

πŸ’– SHMEM_IPUT128(3) πŸ’–

okay so bestie, this is the Open MPI manual, section 3, and this page is the group chat for the entire strided-put friend group β€” not just shmem_iput128. Every single one of these cuties lives here, so let's go 🫢


✨ NAME ✨

Transfer strided data to a specified processing element (PE). That's the whole vibe. The full roster of icons on this page:

  • shmem_complex_iput(3)
  • shmem_double_iput(3)
  • shmem_float_iput(3)
  • shmem_int_iput(3)
  • shmem_integer_iput(3)
  • shmem_iput4(3)
  • shmem_iput8(3)
  • shmem_iput32(3)
  • shmem_iput64(3)
  • shmem_iput128(3)
  • shmem_logical_iput(3)
  • shmem_long_iput(3)
  • shmem_longdouble_iput(3)
  • shmem_longlong_iput(3)
  • shmem_real_iput(3)
  • shmem_short_iput(3)

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

so what do these do?? 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. Simple, chic, effective. ✨

⚠️ but listen: these routines return when the data has been copied out of the source array on the local PE β€” that does not necessarily mean the data has made it to the remote data object yet. So don't be out here assuming the remote side has it. Periodt.

the arguments, bestie

  • target β€” the array to be updated on the remote PE. this data object must be remotely accessible. no exceptions, it's giving mandatory.
  • source β€” the array holding the data that's getting copied. that's your local stash πŸŽ€
  • tst β€” the stride between consecutive elements of the target array. it gets scaled by the element size of the target array. a value of 1 means contiguous data. tst must be of type integer. Fortran besties: it's gotta be a default integer value.
  • sst β€” the stride between consecutive elements of the source array. it gets scaled by the element size of the source array. a value of 1 means contiguous data. sst must be of type integer. Fortran besties: again, default integer value.
  • len β€” the number of elements in the target and source arrays. len must be of type integer. In Fortran it must be a constant, variable, or array element of default integer type.
  • pe β€” the PE number of the remote PE. pe must be of type integer. In Fortran it must be a constant, variable, or array element of default integer type.
ok so both tst and sst get scaled by element size β€” one by the target's element size, one by the source's. don't mix those up, iykyk πŸ™ˆ

typing constraints (the vibe check) 🌈

The target and source data objects must conform to typing constraints, which are as follows:

  • 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.

if you're on the Fortran side, data types must be of default size. like, a real variable has to be declared as REAL, REAL*4 or REAL(KIND=4). that's the rule, no cap. πŸ’€


πŸŽ€ NOTES πŸŽ€

go read intro_shmem(3) for the definition of the term remotely accessible. it's literally the whole lore drop, you need it. πŸ“š


πŸ“ EXAMPLES πŸ“

Consider the following simple shmem_long_iput example for C/C++ programs. (yes we're pasting it exactly as the page has it, down to the punctuation, bestie β€” no editing, no notes πŸ’–)

          #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 */
          }

See also:


2003-2026, The Open MPI Community


and that's the whole page, bestie!! 🫢✨ this serve was brought to you by the Open MPI girlies, page dated Sep 10, 2026, manual name SHMEM_IPUT128(3), signing off β€” go put some strided data somewhere cute. mwah πŸ’…πŸŽ€πŸ¦‹

πŸ“¦ where this page comes from