c++ - 使用 task_group(新用户)的 Intel Threading Building Blocks 性能不佳

标签 c++ tbb

我最近对英特尔线程构建模块产生了兴趣。我想利用 tbb::task_group 类来管理线程池。

我的第一次尝试是构建一个测试,其中一个 vector 复制到另一个 vector 中:我创建了第 n 个任务,每个任务负责复制 vector 的连续切片。

但是,性能会随着线程数的增加而降低。我对另一个线程池实现有相同的结果。使用 TBB 2018 Update 5,gcc 6.3 on debian strecth on 8 i7 core box,我得到以下数字来复制 1'000'000 个元素的 vector :

第n个真实用户

1 0.808s 0.807s

2 1.068s 2.105s

4 1.109s 4.282s

也许你们中的一些人会帮助理解这个问题。这是代码:

#include<iostream>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include "tbb/task_group.h"
#include "tbb/task_scheduler_init.h"

namespace mgis{
  using real = double;
  using size_type = size_t;
}

void my_copy(std::vector<mgis::real>& d,
         const std::vector<mgis::real>& s,
         const mgis::size_type b,
         const mgis::size_type e){
  const auto pb = s.begin()+b;
  const auto pe = s.begin()+e;
  const auto po = d.begin()+b;
  std::copy(pb,pe,po);
}

int main(const int argc, const char* const* argv) {
  using namespace mgis;
  if (argc != 3) {
    std::cerr << "invalid number of arguments\n";
    std::exit(-1);
  }
  const auto ng = std::stoi(argv[1]);
  const auto nth = std::stoi(argv[2]);
  tbb::task_scheduler_init init(nth);
  tbb::task_group g;
  std::vector<real> v(ng,0);
  std::vector<real> v2(ng);
  for(auto i =0; i!=2000;++i){
    const auto d = ng / nth;
    const auto r = ng % nth;
    size_type b = 0;
    for (size_type i = 0; i != r; ++i) {
      g.run([&v2, &v, b, d] { my_copy(v2, v, b, b + d + 1); });
      b += d+1;
    }
    for (size_type i = r; i != nth; ++i) {
      g.run([&v2, &v, b, d] { my_copy(v2, v, b, b + d); });
      b += d ;
    }
    g.wait();
  }
  return EXIT_SUCCESS;
}

最佳答案

  1. 这么短的基准测试没有意义,因为 TBB 需要创建线程并启动它们,它不会在第一次调用 TBB 时立即发生,因为它是惰性异步过程。但是,您的用户时间表明线程已启动并正在运行,但可能没有工作要做。
  2. memcopy 不利于可扩展性研究,因为它不会超出内存 Controller / channel 的数量。因此,无论您有 4 个 CPU 还是 24 个都没有关系,即使是好的硬件,您也不太可能获得超过 x4 的加速。您的 channel 可能较少。
  3. 不要手动分割范围,而是使用tbb::parallel_for,那里不需要task_group。而且,一个一个调用任务是线性复杂度,parallel_for是对数复杂度。

关于c++ - 使用 task_group(新用户)的 Intel Threading Building Blocks 性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52076777/

相关文章:

c++ - 代码中引发的运行时异常

c++ - 使用 Intel TBB 以原子方式修改数组元素

c++ - 并发对象池提供 boost::shared_ptr

c++ - 一个任务的线程数固定的 TBB,其他任务默认

c++ - 克服 Visual Studio 2013 中的 decltype 问题

c++ - namespace 的可见性问题

c++ - 什么类型的字符串最适合用于 Win32 和 DirectX?

c++ - rtai no such file or directory 错误编译

c++ - List<MyClass*> & 数组问题

ios - OS X : convert . dylib 到 .a/.o(动态到静态)?