Существует два способа вложенных петель в TBB.
С 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);
});
});
});
Этого вариант хорошо работает, когда петли принадлежат к разным модулям или/и библиотекам.
В противном случае свернуть две или три вложенные петли с использованием blocked_range2d
или 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]);
}
}
}
});
Они не являются независимыми, если они вложены. –
Извините, я имею в виду, что у них нет никаких зависимостей, поэтому вы можете распараллелить их. – user3562182