SHMEM
SHMEM (from Symmetric Hierarchical Memory access) is a family of parallel programming libraries, initially providing remote memory access for big shared-memory supercomputers using one-sided communications.[1] Later it was expanded to distributed memory parallel computer clusters, and is used as parallel programming interface or as low-level interface to build partitioned global address space (PGAS) systems and languages.[2] The first SHMEM library, libsma, was created by Cray in 1993. Later the SHMEM was also implemented by SGI, Quadrics, HP, GSHMEM, IBM, QLogic, Mellanox, Universities of Houston and Florida; there is also open-source OpenSHMEM.[3]
Historically, SHMEM, the earliest one-sided library,[4] made the one-sided parallel programming paradigm popular.[5]
Programs written using SHMEM can be started on several computers, connected together with some high-performance network, supported by used SHMEM library. Every computer runs a copy of a program (SPMD); each copy is called PE (processing element). PEs can ask the SHMEM library to do remote memory-access operations, like reading ("shmem_get" operation) or writing ("shmem_put" operation) data. Peer-to-peer operations are one-sided, which means that no active cooperation from remote thread is needed to complete the action (but it can poll its local memory for changes using "shmem_wait"). Operations can be done on short types like bytes or words, or on longer datatypes like arrays, sometimes evenly strided or indexed (only some elements of array are sent). For short datatypes, SHMEM can do atomic operations (CAS, fetch and add, atomic increment, etc.) even in remote memory. Also there are two different synchronization methods:[3] task control sync (barriers and locks) and functions to enforce memory fencing and ordering. SHMEM has several collective operations, which should be started by all PEs, like reductions, broadcast, collect.
Every PEs has some of it memory declared as "symmetric" segment (or shared memory area) and other memory is private. Only "shared" memory can be accessed in one-sided operation from remote PEs. It is possible to create symmetric objects which has same address on every PE.
Typical SHMEM functions
- start_pes(N) - start N processing elements (PE)
- _my_pe() - ask SHMEM to return the PE identifier of current thread
- shmem_barrier_all() - wait until all PEs run up to barrier; then enable them to go further
- shmem_put(target, source, length, pe) - write data of length "length" to the remote address "target" on PE with id "pe" from local address "source"
- shmem_get(target, source, length, pe) - read data of length "length" from the remote address "source" on PE with id "pe" and save to read values into local address "target"[6]
List of SHMEM implementations
- SGI: SGI-SHMEM for systems with NUMALink and Altix build with Infiniband network adapters
- Cray's original SHMEM for T3D, T3E, PVP supercomputers[7]
- Cray: MP-SHMEM for Unicos MP (X1E supercomputer)
- Cray: LC-SHMEM for Unicos LC (Cray XT3, XT4, XT5)
- Quadrics: Q-SHMEM[8] for Linux clusters with QsNet interconnect[7]
- Cyclops-64 SHMEM
- HP SHMEM[7]
- IBM SHMEM[7]
- GPSHMEM[7]
- ----- OpenSHMEM implementations (standard effort by SGI and Open Source Software Solutions, Inc.)
- University of Houston: Reference OpenSHMEM[3][7]
- Mellanox ScalableSHMEM[7]
- Portals-SHMEM (on top of Portals interface)
- University of Florida: Gator SHMEM[7]
Disadvantages
In first years SHMEM was accessible only on some Cray machines (later additionally on SGI)[9] equipped with special networks, limiting library widespread and being vendor lock-in (for example, Cray recommends to partially rewrite MPI programs to combine both MPI and shmem calls, which make the program non-portable to other clear-MPI environment).
SHMEM was not defined as standard,[7][9] so there were created several incompatible variants of SHMEM libraries by other vendors. Libraries had different include file names, different management function names for starting PEs or getting current PE id,[7] and some functions were changed or not supported.
Some SHMEM routines were designed according to Cray T3D architecture limitations, for example reductions and broadcasts could be started only on subsets of PEs with size being power of two.[1][7]
Now there are variants of SHMEM libraries, which can run on top of any MPI library, even when a cluster has only non-rdma optimized Ethernet, however the performance will be typically worse than other enhanced networking protocols.
Memory in shared region should be allocated using special functions (shmalloc/shfree), not with the system malloc.[7]
SHMEM is available only for C and Fortran (some versions also to C++).[7]
See also
- Message Passing Interface (especially one-sided operations of MPI-2)
- GASNet
- ARMCI
- Active Messages
- Unified Parallel C (one of PGAS languages, can be implemented on top of SHMEM)
- OpenSHMEM (Open release of the SHMEM API by Open Source Software Solutions, Inc.)
References
- 1 2 Introduction to Parallel Computing - 3.11 Related Work // cse590o course, University of Washington, Winter 2002; page 154
- ↑ "New Accelerations for Parallel Programming" (PDF). Mellanox. 2012. Retrieved 18 January 2014.
SHMEM is being used/proposed as a lower level interface for PGAS implementations
- 1 2 3 Poole, Stephen (2011). "OpenSHMEM - Toward a Unified RMA Model". Encyclopedia of Parallel Computing: 1379–1391. Retrieved 2013-01-15.
- ↑ Tools for Benchmarking, Tracing, and Simulating SHMEM Applications // CUG 2012, paper by San Diego Supercomputer center and ORNL
- ↑ Recent Advances in Parallel Virtual Machine and Message Passing ..., Volume 11 page 59: "One-sided communication as a programming paradigm was made popular initially by the SHMEM library on the Cray T3D and T3E..."
- ↑ man shmem_get (SGI TPL)
- 1 2 3 4 5 6 7 8 9 10 11 12 13 OpenSHMEM TUTORIAL // University of Houston, Texas, 2012
- ↑ Shmem Programming Manual // Quadrics, 2000-2001
- 1 2 SHMEM // Cray, Document 004-2178-002, chapter 3
Further reading
- Shared Memory Access (SHMEM) Routines // Cray Research, 1995
External links
- Using SHMEM on the CRAY T3E
- man intro_shmem (SGI TPL) - Introduction to the SHMEM programming model