【问题标题】:Parallel more than one nested loops with tbb与 tbb 并行多个嵌套循环
【发布时间】:2015-04-18 16:18:41
【问题描述】:

用 tbb 并行三个嵌套独立循环的最佳方法是什么?

for(int i=0; i<100; i++){
    for(int j=0; j<100; j++){
        for(int k=0; k<100; k++){
            printf("Hello World \n");
        }
     }
 }

【问题讨论】:

  • 如果嵌套它们就不是独立的。
  • 对不起,我的意思是它们没有任何依赖关系,所以你可以并行化它们

标签: c++ tbb


【解决方案1】:

TBB 中的嵌套循环基本上有两种方式。

  1. 由于 TBB 旨在完美支持嵌套并行,只需编写嵌套并行 fors:

    tbb::parallel_for(0, 100, [](int i){
        tbb::parallel_for(0, 100, [](int j){
            tbb::parallel_for(0, 100, [](int k){
                printf("Hello World %d/%d/%d\n", i, j, k);
            });
        });
    });
    

    当循环属于不同的模块或/和库时,此变体效果很好。

  2. 否则,使用blocked_range2dblocked_range3d 折叠两个或三个嵌套循环。它还可以帮助优化缓存局部性,从而在访问数组时即使在单个线程上也能提高性能:

    tbb::parallel_for( tbb::blocked_range3d<int>(0, 100, 0, 100, 0, 100),
        []( const tbb::blocked_range3d<int> &r ) {
            for(int i=r.pages().begin(), i_end=r.pages().end(); i<i_end; i++){
                for(int j=r.rows().begin(), j_end=r.rows().end(); j<j_end; j++){
                    for(int k=r.cols().begin(), k_end=r.cols().end(); k<k_end; k++){
                        printf("Hello World %d\n", matrix3d[i][j][k]);
                    }
                }
            }
    });
    

【讨论】:

  • 谢谢!我跑了他们两个,确实第二个有更好的性能。
  • 编译修复:使用r.pages(),r.rows(),r.cols()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 2012-05-19
  • 2020-08-14
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多