【问题标题】:Statically partitioning tbb::parallel_for静态分区 tbb::parallel_for
【发布时间】:2012-09-14 22:49:57
【问题描述】:

我有一个数据集,我想以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

【问题讨论】:

    标签: c++ multithreading tbb


    【解决方案1】:

    这种行为的原因是简单的分区程序按以下标准对您的范围进行分区:

    ceil(grainsize/2)

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

    您可以在3.2.5 Partitioner Summary下查看Tutorial以获取更多信息。

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

    【讨论】:

    • 谢谢。 TBB 是否保证块大小永远不会超过blocked_range 提供的grainsize
    • @JaredHoberock 如果你使用simple_partitioner,上面的等式是有保证的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多