首页 文章

静态分区tbb :: parallel_for

提问于
浏览
4

我有一个数据集,我想用 tbb::parallel_for 以大小 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;
}

输出:

$ 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

1 回答

  • 4

    行为的原因是简单分区程序按以下条件对您的范围进行分区:

    ceil(grainize / 2)<= chunksize <= grainize

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

    您可以在3.2.5分区程序摘要下查看Tutorial以获取更多信息 .

    没有简单的方法可以使用TBB获得固定大小的块(您可以使用OpenMP轻松实现此目的) . 那是因为这违反了TBB的概念 . TBB尝试从您那里抽象出所有这些东西,调度程序确保在运行时尽可能地使用您的线程 .

相关问题