使用 Intel TBB 预先安排并行任务

Pre-schedule parallel tasks with Intel TBB

我以串行方式逐个处理多个批次,并且并行计算每个批次的元素。当我重复这个操作几十次时,它似乎引入了线程调度的一点开销。

我想知道是否可以提前设置这些任务,然后在串行循环中调用它们。批次数或每批次的元素不随时间变化。

// Repeat for N iterations
for (auto n = 0; n < iterations; ++i)
{
    // Serial loop on batches 
    for (auto i = 0; i < BatchCount; ++i)
    {
        // Get current constraint group start index and size
        const auto batchStart = offset[i];
        const auto batchSize  = offset[i + 1] - batchStart;

        // Parallel loop on the batch items
        tbb::parallel_for(tbb::blocked_range<size_t>(0, batchSize, grainSize),
            [&](const tbb::blocked_range<size_t>& range) { 
                for (auto j = range.begin(); j != range.end(); ++j)
                {
                    const auto index = batchStart + j
                    // Call some functions here
                }
            });
    }
}

为了安排 TBB 任务,经验法则是任务应该 执行至少 1 微秒或 10,000 个处理器周期 为了减轻与任务创建相关的开销和 调度。

提前预排任务无助于克服线程 调度开销。

我们假设一个世界,其中轻微的额外开销 动态任务调度是最有效的 暴露并行性并加以利用。这个假设有一个 错误:如果我们可以编写一个应用程序来完美匹配 硬件,没有任何动态调整,我们可能会发现一些 性能提高了几个百分点。

tbb::管道已经 已弃用。它被替换为 tbb::parallel_pipeline。更多 信息请参考以下link: https://spec.oneapi.io/versions/1.0-rev-3/elements/oneTBB/source/algorithms/functions/parallel_pipeline_func.html