SHMEM_DOUBLE_IGET(3)

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

✨ SHMEM_DOUBLE_IGET(3) β€” the strided get squad, Open MPI edition ✨

okay so hi bestie πŸ’– welcome to shmem_double_iget(3), coming at you straight from the Open MPI manual, and it's not just ONE function, it's a whole friend group 🫢. The whole crew is:

and what do they ALL do? they transfer strided data from a specified processing element (PE). that's the whole vibe. slay πŸ’…


πŸ“œ SYNOPSIS

C or C++:

#include <mpp/shmem.h>

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

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

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

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

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

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

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

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

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

void shmem_short_iget(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_IGET(target, source, tst, sst, len,
& pe)

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

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

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

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

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

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

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

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

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

🧠 DESCRIPTION

so the strided get routines do the thing where they pull array data that lives at address source on a remote PE (pe) 🌐. The elements of that source array aren't all cozy next to each other β€” they're separated by a stride called sst (not me making up abbreviations, that's literally the spec). Once the data arrives, it gets stored at the local memory address target, separated by stride tst. And these routines return when the data has been copied into the local target array β€” so when it comes back, the data's already there. no waiting around, periodt ✨

🫢 The arguments (aka the whole cast)

  • target β€” the array that gets updated on the local PE.
  • source β€” the array holding the data to be copied, sitting on the remote PE.
  • tst β€” the stride between consecutive elements of the target array. It gets scaled by the element size of the target array, and a value of 1 means the data is contiguous. tst must be of type integer β€” and if you're calling from Fortran, it's gotta be a default integer value.
  • sst β€” same deal but for the source array: the stride between consecutive elements, scaled by the element size of the source array, 1 means contiguous, must be of type integer, and if you're in Fortran it must be a default integer value.
  • len β€” the number of elements in the target and source arrays. len must be of type integer, and if you're using 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, and if you're using Fortran, again: a constant, variable, or array element of default integer type.

πŸ’… Typing constraints (yes they're strict, no you cannot break them)

target and source data objects must conform to these typing constraints, and bestie they are not flexible:

  • shmem_iget32, shmem_iget4: any noncharacter type that has a storage size equal to 32 bits.
  • shmem_iget64, shmem_iget8: any noncharacter type that has a storage size equal to 64 bits.
  • shmem_iget128: any noncharacter type that has a storage size equal to 128 bits.
  • shmem_short_iget: elements of type short.
  • shmem_int_iget: elements of type int.
  • shmem_long_iget: elements of type long.
  • shmem_longlong_iget: elements of type long long.
  • shmem_float_iget: elements of type float.
  • shmem_double_iget: elements of type double.
  • shmem_longdouble_iget: elements of type long double.
  • SHMEM_COMPLEX_IGET: elements of type complex of default size.
  • SHMEM_DOUBLE_IGET: (Fortran) elements of type double precision.
  • SHMEM_INTEGER_IGET: elements of type integer.
  • SHMEM_LOGICAL_IGET: elements of type logical.
  • SHMEM_REAL_IGET: elements of type real.

and then, because the original doc said it with its whole chest, here it is again 🩷 (yes, for real, it's listed twice β€” I'm not the one who did that, I'm just the messenger πŸ’€):

  • shmem_longdouble_iget: elements of type long double.
  • SHMEM_COMPLEX_IGET: elements of type complex of default size.
  • SHMEM_DOUBLE_IGET: (Fortran) elements of type double precision.
  • SHMEM_INTEGER_IGET: elements of type integer.
  • SHMEM_LOGICAL_IGET: elements of type logical.
  • SHMEM_REAL_IGET: elements of type real.

and if you're on Fortran, data types must be of default size β€” like, a real variable has to be declared as REAL, REAL*4, or REAL(KIND=4). no sneaky bigger kinds, okay? 🌸


πŸ“ NOTES

want the actual definition of the term remotely accessible? go read intro_shmem(3). it's giving required reading πŸ“š


🌈 EXAMPLES

here's a cute little Fortran program that uses shmem_logical_iget. compile it with the -lsma compiler option, bestie πŸ”₯

PROGRAM STRIDELOGICAL
  LOGICAL SOURCE(10), TARGET(5)
  SAVE SOURCE ! SAVE MAKES IT REMOTELY ACCESSIBLE
  DATA SOURCE /.T.,.F.,.T.,.F.,.T.,.F.,.T.,.F.,.T.,.F./
  DATA TARGET / 5*.F. /

  CALL START_PES(2)
  IF (MY_PE() .EQ. 0) THEN
    CALL SHMEM_LOGICAL_IGET(TARGET, SOURCE, 1, 2, 5, 1)
    PRINT*,'TARGET AFTER SHMEM_LOGICAL_IGET:',TARGET
  ENDIF
  CALL SHMEM_BARRIER_ALL
END

See also:

intro_shmem(3) shmem_get(3) shmem_quiet(3)

go read those too, they're all bangers πŸ’–


πŸŽ€ pspsps β€” Copyright: 2003-2026, The Open MPI Community. This page left the group chat on Sep 10, 2026 as part of Open MPI. stay strided, stay iconic, and don't forget your strides are scaled by element size πŸ‘‘πŸ’…βœ¨
πŸ“¦ where this page comes from