2015-04-18 20 views
6

Cách tốt nhất để song song ba vòng độc lập lồng nhau với tbb là gì?Song song nhiều hơn một vòng lặp lồng nhau với 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

Chúng không phải độc lập nếu họ đang lồng nhau. –

+0

Xin lỗi, ý tôi là họ không có bất kỳ sự phụ thuộc nào để bạn có thể song song chúng – user3562182

Trả lời

10

Về cơ bản có hai cách cho các vòng lồng nhau trong TBB.

  1. Kể từ TBB được thiết kế để hỗ trợ một cách hoàn hảo song song lồng nhau, chỉ cần viết fors song song lồng nhau:

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

    biến này hoạt động tốt khi các vòng thuộc về module khác nhau hoặc/và thư viện.

  2. Nếu không, hãy thu gọn hai hoặc ba vòng lồng nhau bằng cách sử dụng blocked_range2d hoặc blocked_range3d. Nó bổ sung có thể giúp tối ưu hóa bộ nhớ cache địa phương và do đó tăng hiệu suất ngay cả trên một chủ đề duy nhất khi truy cập vào các mảng:

    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

Cảm ơn bạn! Tôi chạy cả hai và đúng là cái thứ hai có hiệu suất tốt hơn. – user3562182

+0

sửa lỗi biên dịch: sử dụng 'r.pages()', 'r.rows()', 'r.cols()' – ShaulF

+0

@ShaulF, cảm ơn, đã sửa – Anton

Các vấn đề liên quan