Two Levels of Parallelism
Ionworks applies parallelism at two levels during optimization:Batch-level: Multistart Runs
When you configure multiple multistarts, all runs are coordinated from a single driver and share one worker pool. The driver dispatches each start’s evaluations onto the pool and processes results as workers finish — it does not launch a separate task or reserve a dedicated CPU per start. Concurrency across starts is bounded by the pool size: if total demand exceeds the available workers, evaluations queue and run as workers free up.Optimizer-level: Distributed Evaluation
Population-based optimizers evaluate a population of candidate solutions every generation. These evaluations are dispatched across the shared worker pool, which scales to host them. The following optimizers are population-based and support distributed evaluation:
Non-population-based optimizers (e.g. Nelder-Mead) evaluate one candidate at a time, so a single such run cannot parallelize internally. Multiple non-population multistarts still run concurrently across the shared pool — one in-flight evaluation per start.
Streaming (async) evaluation
The driver streams results: it feeds each candidate result back to its optimizer as soon as a worker finishes, rather than waiting for the entire generation to complete. This reduces idle time when individual evaluations vary in duration — fast evaluations are processed immediately while slower ones continue in the background. It is automatic for all population-based optimizers (Differential Evolution, CMA-ES, PSO, XNES, SNES).Streaming evaluation does not change optimization results — it only affects throughput. Each optimizer receives the same candidate-result pairs regardless of the order in which workers finish.
Resource Allocation
The worker pool is sized to the fit’s demand:num_starts × generation width × per-point tasks, where the generation width is the population size for population-based optimizers (1 for non-population optimizers) and per-point tasks equals the number of objectives when objective-level parallelism is enabled. This demand is capped by the total worker supply available — i.e. min(demand, supply). There is no fixed per-job worker count.
The pool scales up and down as jobs start and finish. When you run against your own machine, the currently-free CPU count is used as the supply cap. The pool is always built with at least one worker; when only one worker is available the fit’s evaluations run effectively sequentially through it.
The pool size is determined automatically from the fit’s demand and available supply. No manual worker-count configuration is required.
Scenarios
The following examples illustrate how resources are allocated in different configurations.Scenario 1: Multiple Multistarts with a Population-based Optimizer
4 multistarts with CMA-ES All four starts are coordinated from the driver and share one worker pool sized to the combined demand across all starts —num_starts × population × per-point tasks — capped by the available supply. The pool scales to host the work, and every start’s population evaluations are dispatched across it.
Scenario 2: Single Multistart with a Population-based Optimizer
1 multistart with PSO The driver coordinates one run. The worker pool is sized to that run’s demand (1 × population × per-point tasks), capped by the available supply. All workers serve the population evaluations for that single run.
Scenario 3: Many Multistarts
32 multistarts with CMA-ES The shared worker pool is sized to the aggregate demand across all 32 starts, capped by the total supply. The pool scales to meet demand; until it has fully scaled, evaluations queue and start as workers become available.Scenario 4: Multiple Multistarts on Your Own Machine
4 multistarts with CMA-ES running locally The pool is sized to the fit’s demand, capped by your machine’s currently-free CPUs (the supply). The starts share whatever pool that yields; if fewer CPUs are free than the fit demands, evaluations queue and run as workers free up.Scenario 5: Single Multistart with a Non-population-based Optimizer
1 multistart with Nelder-Mead The driver coordinates one run. Because Nelder-Mead is not population-based, it evaluates one candidate at a time, so this single run runs effectively sequentially on one worker.Summary
Next Steps
- Learn about Optimization Templates to understand available templates
- Follow the guide on Running an Optimization for step-by-step instructions