2015-04-18 1 views
6

Каков наилучший способ параллельной работы трех вложенных независимых циклов с 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"); 
     } 
    } 
} 
+0

Они не являются независимыми, если они вложены. –

+0

Извините, я имею в виду, что у них нет никаких зависимостей, поэтому вы можете распараллелить их. – user3562182

ответ

10

Существует два способа вложенных петель в 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_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]); 
           } 
          } 
         } 
    }); 
    
+2

Спасибо! Я побежал их обоих, и это правда, что вторая имеет лучшую производительность. – user3562182

+0

сборник fix: используйте 'r.pages()', 'r.rows()', 'r.cols()' – ShaulF

+0

@ShaulF, спасибо, исправлено – Anton

Смежные вопросы