使用 task_group 的英特尔线程构建模块性能不佳(新用户)
Poor performance with Intel Threading Building Blocks using task_group (new user)
我最近对英特尔线程构建模块产生了兴趣。我想利用tbb::task_group
类来管理线程池。
我的第一次尝试是构建一个测试,其中复制另一个向量:我创建第 n 个任务,每个任务负责复制向量的连续切片。
但是,性能会随着线程数的增加而降低。我对另一个线程池实现有相同的结果。使用 TBB 2018 Update 5,gcc 6.3 在 debian strecth 上的 8 i7 核心盒上,我得到以下数字来复制 1'000'000 个元素的向量:
第 n 个真实用户
1 0.808秒 0.807秒
21.068秒 2.105秒
41.109秒 4.282秒
也许你们中的一些人会帮助理解这个问题。这是代码:
#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 argumentsn";
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;
}
- 这么短的基准测试没有意义,因为 TBB 需要创建线程并启动它们,它不会在第一次调用 TBB 时立即发生,因为它是惰性的异步进程。但是,您的用户时间表明线程已启动并正在运行,但可能没有工作要做。
- MEMCOPY 不利于可扩展性研究,因为它不会扩展到内存控制器/通道的数量之外。因此,无论您有 4 个 CPU 还是 24 个 CPU,即使对于好的硬件,您也不太可能获得超过 4 倍的加速。您的频道可能较少。
- 与其手动拆分范围,不如使用
tbb::parallel_for
,您不需要在那里task_group
。此外,逐个调用任务具有线性复杂度,parallel_for
具有对数复杂度。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 使用新行和不使用新行读取文件
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 使用 task_group 的英特尔线程构建模块性能不佳(新用户)
- 使用较新版本的 g++ 导致多线程性能下降?
- 如何创建一个C ++函数,该函数在每次用户输入新数据时创建新对象
- 用户定义功能的返回值的分配:性能
- 如何在C 项目中包括在GitHub上托管的库?(新的C 用户 - 以前使用的语言与软件包管理器使用)
- Visual Studio 2010 与 2012 编译时性能和稳定性比较,适用于C++用户
- 如何使用数组在用户猜测新数字之前显示以前的猜测列表
- C++:如果用户输入的号码有误,则要求用户输入新号码
- Windows 8 C++ Qt 添加新用户
- wxGrid 在用户编辑单元格后显示旧值而不是新值
- pthread_mutex锁是否提供比用户在代码中施加的内存屏障更高的性能
- 用户定义分配器的非标准库放置新功能
- wxPanel 双击以允许用户键入新标题
- Win32“浏览文件夹”对话框:用户创建新文件夹时返回错误的文件夹
- 是否有可能在每次while循环迭代后将用户输入存储在一个新变量中?
- Windows 7操作系统下创建/删除新用户
- 为新类型的迭代器添加用户定义的迭代器标记的推荐方法是什么?