首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >静态分区tbb::parallel_for

静态分区tbb::parallel_for
EN

Stack Overflow用户
提问于 2012-09-15 06:49:58
回答 1查看 2.8K关注 0票数 5

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

有没有办法使用TBB进行这种静态分区?这个测试产生了几个比我系统上的interval_size更小的时间间隔:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
$ 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-15 19:10:32

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

粒度大小(

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

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

您可以在3.2.5分区程序摘要中查看Tutorial以了解更多信息。

使用TBB没有简单的方法来获得固定大小的块大小(使用OpenMP可以很容易地实现这一点)。这是因为这与TBB的概念背道而驰。TBB试图将所有这些东西从你那里抽象出来,而调度器会确保你的线程在运行时得到最好的利用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12432961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档