gpt4 book ai didi

C++ intel TBB 内循环优化

转载 作者:行者123 更新时间:2023-11-28 08:10:22 28 4
gpt4 key购买 nike

我正在尝试使用英特尔 TBB 来并行化一个内部循环(3 个循环中的第 2 个循环),但是,只有当内部 2 个循环的规模很大时,我才能获得不错的返回。

TBB 是否为主循环的每次迭代生成新线程?有没有办法减少开销?

tbb::task_scheduler_init tbb_init(4); //I have 4 cores
tbb::blocked_range<size_t> blk_rng(0, crs_.y_sz, crs_.y_sz/4);
boost::chrono::system_clock::time_point start =boost::chrono::system_clock::now();
for(unsigned i=0; i!=5000; ++i)
{
tbb::parallel_for(blk_rng,
[&](const tbb::blocked_range<size_t>& br)->void
{
:::

值得注意的是 openMP(我正试图删除它!!!)没有这个问题。

我正在编译:

英特尔 ICC 12.1 在 -03 -xHost -mavx

在英特尔 2500k(4 核)上

编辑:我真的可以改变循环的顺序,因为输出循环测试需要用基于循环结果的谓词替换。

最佳答案

不,TBB 不会为每次调用 parallel_for 生成新线程。实际上,与每个可能启动一个新线程组的 OpenMP 并行区域不同,TBB 与同一个线程组一起工作,直到所有 task_scheduler_init 对象被销毁;并且在隐式初始化的情况下(省略 task_scheduler_init),将使用相同的工作线程直到程序结束。

所以性能问题是由其他原因引起的。根据我的经验,最可能的原因是:

  • 缺乏编译器优化,首先是自动矢量化(可以通过比较 OpenMP 和 TBB 的单线程性能来检查;如果 TBB 慢得多,那么这是最可能的原因)。
  • 缓存未命中;如果你运行相同的数据 5000 次,缓存局部性非常重要,OpenMP 的默认 schedule(static) 工作得很好,每次都确定性地重复完全相同的分区,而 TBB 的工作窃取调度器有显着随机性。将 blocked_range 粒度设置为 problem_size/num_threads 可确保每个线程一个工作,但不保证相同的工作分配; affinity_partitioner 应该可以帮助解决这个问题。

关于C++ intel TBB 内循环优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9299474/

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