C++英特尔TBB内部循环优化
C++ intel TBB inner loop optimisation
我正试图使用Intel 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(我正试图删除它!!)没有这个问题。
我正在编译:
intel ICC 12.1 at-03-xHost-mavx
在英特尔2500k(4核)上
EDIT:我真的可以改变循环的顺序,因为out循环测试需要替换为基于循环结果的谓词。
否,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可以确保每个线程有一个工件,但不能保证工件的分布相同;而CCD_ 5应该对此有所帮助
相关文章:
- gcc 如何优化此循环?
- 循环比较(优化)
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 优化在网格图中查找哈密尔循环的函数?
- 未能优化看似明显的循环不变量(但volatile限定符发挥了神奇的作用)
- 在循环条件中调用const vector size()似乎缺少优化
- GCC 优化了基于固定范围的 for 循环,就好像它具有更长的可变长度一样
- 通过循环展开和阻塞进行优化
- 为什么 CLang++ 不优化循环,而 G++ 优化循环?
- 嵌套循环 C++ 的优化
- 如何在卷积程序的 c++ 中优化嵌套循环
- G 4.8.5带负数组索引的循环优化错误
- 使用 OpenMP 优化外循环并减少
- 编译时循环优化
- 有没有一种方法可以关闭C++和Rust编译中的循环优化
- c++循环优化和一些错误
- 用于顺序内存访问的编译器嵌套循环优化
- C++英特尔TBB内部循环优化
- c++ while循环优化不能正常工作
- "virtual"循环优化中的局部变量声明