2015-04-18 17 views
6

Üç iç içe geçmiş bağımsız döngüleri tbb ile paralelleştirmenin en iyi yolu nedir?Paralel birden fazla iç içe geçmiş döngüler ile 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

Onlar bağımsız değiller. –

+0

Maalesef, bağımlılıkları yok yani onları paralel hale getirebilirsiniz – user3562182

cevap

10

Temel olarak TBB'de yuvalanmış döngüler için iki yol vardır. TBB yana

  1. iç içe paralel Fors mükemmel, iç içe paralelliği destekleyen sadece yazmak için tasarlanmıştır: döngüler farklı modül veya/ve kütüphanelere ait olduğunda

    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); 
         }); 
        }); 
    }); 
    

    Bu varyant iyi çalışıyor. Aksi halde, blocked_range2d veya blocked_range3d kullanarak iki veya üç iç içe döngüyü daraltın. Bu ek diziler erişirken önbellek yerellik optimize etmek ve böylece bile tek iş parçacığı üzerinde performansı artırmak için yardımcı olabilir: bunlar iç içe eğer

    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

Teşekkür ederiz! İkisini de koştum ve ikincisinin daha iyi bir performansa sahip olduğu doğru. – user3562182

+0

derleme düzeltmesi: 'r.pages()', 'r.rows()', 'r.cols()' – ShaulF

+0

@ShaulF kullanın, teşekkürler, düzeltildi – Anton