Process parameters ================== The process parameters are: initial_load [neighbors...] Communications ============== There are two receiving channels per host: control for information messages, and data for load transfers. Process model ============= Each process is made of 3 threads: a receiver thread, a computing thread, and a load-balancer thread. * Receiver thread --------------- Loop | wait for a message to come, either on data channel, or on ctrl channel | push received message in a buffer of received messages | -> ctrl messages on the one side | -> data messages on the other side +- The loop terminates when a "finalize" message is received on each channel. * Computing thread ---------------- Loop | 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 +- send CLOSE on data for all neighbors wait for CLOSE on data from all neighbors The loop terminates when process::still_running() returns false. (read the source for full details...) * Load-balancing thread --------------------- Loop | call load-balancing algorithm | send ctrl messages | receive ctrl messages +- 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?