in benchmarks/pipeline_benchmark.cpp [139:160]
void runDispensoPar(std::vector<std::unique_ptr<uint8_t[]>>& results) {
results.resize(kNumImages);
std::atomic<size_t> counter(0);
dispenso::pipeline(
dispenso::stage(
[&counter]() -> dispenso::OpResult<Work> {
size_t curIndex = counter.fetch_add(1, std::memory_order_acquire);
if (curIndex < kNumImages) {
return fillImage(Work(curIndex));
}
return {};
},
dispenso::kStageNoLimit),
dispenso::stage(computeGeometricMean, dispenso::kStageNoLimit),
dispenso::stage(
[&results](Work work) {
size_t index = work.index;
results[index] = tonemap(std::move(work));
},
dispenso::kStageNoLimit));
}