静态分区 tbb::parallel_for

Jar*_*ock 5 c++ multithreading tbb

我有一个数据集,我想以tbb::parallel_forsize 的间隔使用它interval_size。我的函子消耗的每个间隔应该是interval_size,除了最后一个部分间隔,当interval_size不均匀划分我的数据集时,它可能会更小。

有没有办法使用TBB以这种方式进行静态分区?该测试产生的间隔比interval_size我的系统上的要小:

#include <tbb/parallel_for.h>
#include <iostream>

struct body
{
  void operator()(const tbb::blocked_range<size_t> &r) const
  {
    std::cout << "range size: " << r.end() - r.begin() << std::endl;
  }
};

int main()
{
  size_t num_intervals = 4;
  size_t interval_size = 3;

  // consume num_intervals plus a partial interval in total
  size_t n = num_intervals * interval_size + (interval_size - 1);
  tbb::parallel_for(tbb::blocked_range<size_t>(0, n, interval_size),
                    body(),
                    tbb::simple_partitioner());

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ g++ test_parallel_for.cpp -ltbb
$ ./a.out 
range size: 3
range size: 2
range size: 2
range size: 3
range size: 2
range size: 2
Run Code Online (Sandbox Code Playgroud)

inf*_*inf 4

出现此行为的原因是简单分区程序按以下标准对范围进行分区:

ceil(粒度/2) <= 块大小 <= 粒度

与 and 一起使用时tbb::blocked_range(i, j, grainsize)chunksize 是范围的大小。

您可以在3.2.5 分区器摘要下查看教程以获取更多信息。

没有简单的方法可以使用 TBB 获得固定大小的块大小(您可以使用 OpenMP 轻松实现这一点)。这是因为这违背了TBB的概念。TBB 尝试将所有这些东西从您手中抽象出来,调度程序确保您的线程在运行时得到尽可能最好的使用。