2012-11-13 34 views
20

Đoạn mã sau có song song với vòng đầu tiên (bên ngoài) hay nó song song với toàn bộ vòng lặp lồng nhau?OpenMP xử lý các vòng lồng nhau như thế nào?

#pragma omp parallel for 
    for (int i=0;i<N;i++) 
    { 
     for (int j=0;j<M;j++) 
     { 
     //do task(i,j)// 
     } 
    } 

Tôi chỉ muốn chắc chắn nếu các mã trên sẽ parallelize toàn bộ lồng nhau cho-vòng (như vậy, một thread nhiệm vụ liên quan trực tiếp (i, j)), hoặc nó chỉ song song quá trình bên ngoài cho vòng lặp (như vậy, nó đảm bảo rằng, đối với mỗi luồng song song với chỉ số vòng lặp i, vòng lặp bên trong của nó sẽ được thực hiện tuần tự trong một chuỗi duy nhất, đó là rất import).

Trả lời

27

Các dòng bạn đã viết sẽ song song chỉ vòng ngoài. Parallelize cả bạn cần phải thêm một điều khoản collapse:

#pragma omp parallel for collapse(2) 
    for (int i=0;i<N;i++) 
    { 
     for (int j=0;j<M;j++) 
     { 
     //do task(i,j)// 
     } 
    } 

Bạn có thể muốn kiểm tra thông số kỹ thuật OpenMP 3.1 (giây 2.5.1) để biết thêm chi tiết.

+1

Cảm ơn, điều đó thật tuyệt, tôi chỉ muốn song song các vòng ngoài trong khi đảm bảo các vòng lặp bên trong thực hiện công việc tuần tự. – user0002128

4

OpenMP chỉ song song vòng lặp bên cạnh pragma. Bạn có thể song song vòng lặp bên trong nếu bạn muốn nhưng nó sẽ không được thực hiện tự động.

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