使用 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
我以串行方式逐个处理多个批次,并且并行计算每个批次的元素。当我重复这个操作几十次时,它似乎引入了线程调度的一点开销。
我想知道是否可以提前设置这些任务,然后在串行循环中调用它们。批次数或每批次的元素不随时间变化。
// 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