2015-04-18 15 views
6

Was ist der beste Weg, drei verschachtelte unabhängige Schleifen mit tbb zu parallelisieren?Parallel mehrere verschachtelte Schleifen mit 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"); 
     } 
    } 
} 
+0

Sie sind nicht unabhängig, wenn sie verschachtelt sind. –

+0

Sorry, ich meine, sie haben keine Abhängigkeiten, so dass Sie sie parallelisieren können – user3562182

Antwort

10

Es gibt grundsätzlich zwei Möglichkeiten für verschachtelte Schleifen in TBB.

  1. 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.

  2. 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]); 
           } 
          } 
         } 
    }); 
    
+2

Vielen Dank! Ich habe beide gespielt und es ist wahr, dass der zweite eine bessere Leistung hat. – user3562182

+0

Kompilierung beheben: verwenden 'r.pages()', 'r.rows()', 'r.cols()' – ShaulF

+0

@ShaulF, danke, behoben – Anton

Verwandte Themen