A more or less up-to-date version of POSH is available on GitHub. Right now you can find v0.11 there.
POSH (Paris OpenSHMEM) is an open-source implementation of the OpenSHMEM specification. It was released under the GPLv3 library. The logo was designed by the awesome Juliette Pouzet, then intern at LIPN. |
![]() |
A more or less up-to-date version of POSH is available on GitHub. Right now you can find v0.11 there.
New! A nice autoconfautomake system has been added to POSH. Here comes v0.1.1!
It can be downloaded from here: [GZ] or [BZ2].
It requires:
The current and very first version of POSH is v0.1. It is very preliminary. It does not feature any nice automake/autoconf configuration and compilation system yet (but it comes with a Makefile), the algorithms used inside are quite simplistic, but it works.
![]() |
The memory model specified by OpenSHMEM and implemented by POSH consists of two parts for each processing element:
Global, static variables are put inside of the symmetric heap.
The fact that it public heaps are symmetric is important for memory management. As a matter of fact, memory allocations in the symmetric heap must be done in a symmetric way, in a sense that all the processing elements perform the same memory allocation. The OpenSHMEM specification states that before exiting, allocations in the symmetric heap must call a synchronization barrier in order to ensure this symmetry.
![]() |
OpenSHMEM specifies one-sided peer-to-peer communications between processing elements. Basically, a process can read data from another process's symmetric heap or write data in another process's symmetric heap. Memory is allocated in symmetric heaps using the shmalloc() routine. A family of shmem_*_put() and shmem_*_p() routines are available (one for each supported datatype) to write data at a remote address. |
long source[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
static long* target = (int *) shmalloc( 10 * sizeof( long ) ); if (_my_pe() == 0) { /* put 10 elements into target on PE 1 */ shmem_long_put(target, source, 10, 1); } |
Similarly, a family of shmem_*_get() and shmem_*_g() routines are available (one for each supported datatype) to read remote data. |
short* ptr;
ptr = (short*)shmalloc( sizeof( short ) ); short toto = shmem_short_g( ptr, ( rank + 1 ) % size ); |