Về cơ bản có hai cách cho các vòng lồng nhau trong TBB.
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.
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]);
}
}
}
});
Chúng không phải độc lập nếu họ đang lồng nhau. –
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