Date: 2011-08-25
Author: Sébastien Boisvert
Subject: VirtualProcessor
Written on: VIA train 60 (Toronto -> Montréal)


The VirtualProcessor I developed enables any MPI rank to have thousands of workers working
on different tasks. In reality, only one worker can work at any given moment, but
the VirtualProcessor schedules fairly the workers on the only instruction pipeline
available so that is not a problem at all.


The VirtualProcessor is a technology that make thousands of worker compute tasks
in parallel on a single MPI rank. Obviously, only one such worker is active at
any point, but they all get to work.

The idea is that when a worker pushes a message on the VirtualCommunicator, it has
to wait for a reply. And this reply may arrive later. The idea of the
VirtualProcessor is to easily submit communication-intensive tasks. 

Basically, the VirtualCommunicator groups smaller messages into larger messages
to send fewer messages on the physical network.

But to achieve that, an easy way of generating a lot of small messages is
needed. This is the use of the VirtualProcessor.


== Implementation ==

Author: Sébastien Boisvert
License: GPL
code/scheduling/VirtualProcessor.h
code/scheduling/VirtualProcessor.cpp


== Workers ==

In Ray, each MPI rank actually has thousands of workers within it. All these
workers are scheduled, one after the other, inside the same process. No thread
are utilised as these would trash the processor cache. 

At any point in time, each of these worker is in one of these states:

- active;
- sleeping;
- completed.



active 

	The worker is not waiting for a message reply.

sleeping

	The worker is waiting for a message reply.

completed

	The worker has completed its task.

