Process model
=============
-Each process is made of 3 threads: a receiver thread, a computing
-thread, and a load-balancer thread.
+Each process is made of 3 threads: a receiving thread, a computing
+thread, and a load-balancing thread.
-* Receiver thread
- ---------------
+* Receiving thread
+ ----------------
Loop
| wait for a message to come, either on data channel, or on ctrl channel
| if we received some real load, get it (data messages)
| if there is some real load to send, send it
| if we own some load, simulate some computing on it
+ | sleep a bit if we are looping too fast
+-
send CLOSE on data for all neighbors
wait for CLOSE on data from all neighbors
---------------------
Loop
+ | receive ctrl messages
| call load-balancing algorithm
| send ctrl messages
- | receive ctrl messages
+ | sleep (min_lb_iter_duration)
+-
send CLOSE on ctrl for all neighbors
wait for CLOSE on ctrl from all neighbors
The loop terminates when process::still_running() returns false.
(read the source for full details...)
-Open questions
-==============
- * definition of load on heterogeneous hosts?
- * how to detect convergence?
- : No need to detect convergence. Computation stops when there
- nothing more to do.
- * how to manage link failures?
+Some notes about *load attributes
+=================================
+process::real_load Current *real* load.
+ Used for the computations.
+ Displayed in log messages.
+
+process::expected_load Current load estimation.
+ Used for load-balancing estimation, and for
+ diffusing to neighbors.
+ * Without bookkeeping, it equals real_load
+ minus pending sends.
+ * With bookkeeping, it corresponds to the
+ "virtual load".
+
+process::received_load Real load received from neighbors.
+ Used when receiveing data messages, and then
+ added to real_load.