blob: 6fe821f2a8107e3af81d3d18785fa5021f831a0e [file] [log] [blame]
Each image is its own process, that is forked from the master process at the
start of the program. The number of images is determined by the environment
variable GFORTRAN_NUM_IMAGES or, alternatively, the number of processors.
Each coarray is identified by its address. Since coarrays always behave as if
they had the SAVE attribute, this works even for allocatable coarrays. ASLR is
not an issue, since the addresses are assigned at startup and remain valid over
forks. If, on two different images, the allocation function is called with the
same descriptor address, the same piece of memory is allocated.
Internally, the allocator (alloc.c) uses a shared hashmap (hashmap.c) to
remember with which ids pieces of memory allocated. If a new piece of memory is
needed, a simple relatively allocator (allocator.c) is used. If the allocator
doesn't hold any previously free()d memory, it requests it from the shared
memory object (shared_memory.c), which also handles the translation of
shared_mem_ptr's to pointers in the address space of the image. At the moment
shared_memory relies on double-mapping pages for this (which might restrict the
architectures on which this will work, I have tested this on x86 and POWER),
but since any piece of memory should only be written to through one address
within one alloc/free pair, it shouldn't matter that much performance-wise.
The entry points in the library with the exception of master are defined in
wrapper.c, master(), the function handling launching the images, is defined in
coarraynative.c, and the other files shouldn't require much explanation.
To compile a program to run with native coarrays, compile with -fcoarray=shared
-lcaf_shared -lrt (I've not yet figured out how to automagically link against
the library if -fcoarray=shared is specified).
TODO (the list is probably incomplete):
- make STAT and ERRMSG work for ALLOCATE, DEALLOCATE, SYNC and locks
- Teams
- Types containing allocatable components in coarrays
- Events
- MOVE_ALLOC
- automatic linking of relevant libraries with -fcoarray=shared