使用 tbb 并行多个嵌套循环
Parallel more than one nested loops with tbb
用 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");
}
}
}
TBB中的嵌套循环基本上有两种方式。
由于TBB是为了完美支持嵌套并行而设计的,直接写nested parallel 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);
});
});
});
当循环属于不同模块 or/and 库时,此变体效果很好。
否则,使用 blocked_range2d
or blocked_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]);
}
}
}
});
用 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");
}
}
}
TBB中的嵌套循环基本上有两种方式。
由于TBB是为了完美支持嵌套并行而设计的,直接写nested parallel 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); }); }); });
当循环属于不同模块 or/and 库时,此变体效果很好。
否则,使用
blocked_range2d
orblocked_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]); } } } });