gpt4 book ai didi

c++ - 静态分区 tbb::parallel_for

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:46 25 4
gpt4 key购买 nike

我有一个数据集,我想以 interval_size 大小的间隔使用 tbb::parallel_for。我的仿函数消耗的每个区间都应该是 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

最佳答案

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

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

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

您可以查看 Tutorial3.2.5 分区程序摘要下获取更多信息。

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

关于c++ - 静态分区 tbb::parallel_for,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12432961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com