initial work on miniranks with VirtualMachine and Minirank

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
I added some design documentation for mini-ranks.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
spinlocks are more suitable for this job

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
added design documentation for mini-ranks.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
First implementation of mini-ranks in RayPlatform

The code compiles without any errors or warnings. The next step
is to port an application to this programming model.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
The core must provide the mini-rank number.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
Documentation: added description of macros.

Macros are available for building plugins and adapters.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
Fixed some bugs in the mini-ranks model.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
Moved the destruction of allocators in the core.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
Mini-rank source and mini-rank destination are required.

They must be stored in the buffer.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
The desctructor of the middleware must be called.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
A mini-rank must tell the rank that it has messages to send.

Otherwise, there is a intricate web of locks.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
The class MessageQueue does the job of receiving messages.

The MPI rank receives messages in MessageQueue, and mini-ranks take
their messages from their.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
Non-blocking queues will be used for the communication.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
The non-blocking message queue for mini-ranks is ready.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
MPI_Recv must be called to get the mini-rank numbers.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
This is the branch for RayPlatform v7.0.0.

The tentative code name is "Nested Droids of Luck".

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
core: The old behavior (no mini-ranks) now works as expected

The implementation of mini-ranks added some complexity. But this
complexity was reduced and now the same code runs in pure MPI
mode (1 UNIX process per MPI rank) or in mini-ranks mode (with
1 IEEE POSIX thread per mini-rank). If the end user does not
say anything about mini-ranks, the default is to use 1 process
per MPI rank and no thread at all (and no mini-rank).

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
core: RayPlatform is responsible for creating mini-ranks

The code that creates mini-ranks was moved from the application to
RayPlatform. This reduces the size of the code needed in the
application.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>
Message reception is now interleaved with send operations.

The obvious way to implement the communication layer is to receive
and send messages in a loop (receive followed by send). However,
although receiving a message is always fast, sending messages is
slower because there is a loop over all the mini-ranks. This patch
fixes this by interleaving the reception in the sending loop.

Signed-off-by: Sébastien Boisvert <sebastien.boisvert.3@ulaval.ca>