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.

POSH logo
POSH on GitHub

A more or less up-to-date version of POSH is available on GitHub. Right now you can find v0.11 there.

Release: v0.1.1

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:

Release: v0.1

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.

It can be downloaded from here: [GZ] or [BZ2].

Publications
Poster
poster ICCS
Memory model
Symmetric heap

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.

Communication model
One-sided communications

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 );
Valid XHTML 1.0 Strict