Es gibt grundsätzlich zwei Möglichkeiten für verschachtelte Schleifen in TBB.
Da TBB ist so konzipiert, verschachtelte Parallelität zu perfekt unterstützen, nur verschachtelten parallel fors schreiben:
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);
});
});
});
Diese Variante funktioniert gut, wenn die Schleifen an unterschiedlichen Modulen oder/und Bibliotheken gehören.
Andernfalls zwei oder drei verschachtelte Schleifen unter Verwendung von blocked_range2d
oder blocked_range3d
zusammenfassen. Es kann zusätzlich helfen Cache Lokalität zu optimieren und somit die Leistung sogar auf einem einzigen Thread zu erhöhen, wenn Arrays Zugriff:
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]);
}
}
}
});
Sie sind nicht unabhängig, wenn sie verschachtelt sind. –
Sorry, ich meine, sie haben keine Abhängigkeiten, so dass Sie sie parallelisieren können – user3562182