When solving a large quantity of small instances, many many-core systems can be used by running several prospr processes in parallel.
However, solving very large instances remains intractable due to job timeouts.
Therefore, at least one algorithm (e.g., depth_first_bnb) should be implemented, which leverages multiple cores (across multiple nodes1) to solve these instances in parallel.
A naive approach could work like this:
- Determine the number of available ranks.
- Iterate algorithm to a matching depth in the tree (#subtrees $\ge$ #ranks).
- Clone state and solve subtree on each rank.
- Reduce subtree results. 2
A better approach would be to use master-worker paradigm3 using non-blocking MPI:
- The root rank generates "jobs" (partial solution, state, optimum) or quit message (receive request from any).
- Other ranks request jobs from root and send back new jobs (recursion) or subtree optima.
- The root rank must sort jobs by subtree depth to enforce a global depth-first criterion, and can also prune non-optimal partial results.
Note: This second approach results in a lot of communication. Therefore, a worker should solve the whole subtree if it is rather shallow (e.g., depth = 7).
When solving a large quantity of small instances, many many-core systems can be used by running several prospr processes in parallel.
However, solving very large instances remains intractable due to job timeouts.
Therefore, at least one algorithm (e.g.,
depth_first_bnb) should be implemented, which leverages multiple cores (across multiple nodes1) to solve these instances in parallel.A naive approach could work like this:
A better approach would be to use master-worker paradigm3 using non-blocking MPI:
Note: This second approach results in a lot of communication. Therefore, a worker should solve the whole subtree if it is rather shallow (e.g., depth = 7).
Footnotes
Consider using include guards around these code regions to keep supporting systems without MPI support. ↩
Guard critical section to avoid race conditions. ↩
cf. Borisenko and Gorlatch (2016) ↩