2016-06-28 30 views
7

Trong C++ với OpenMP, là có bất kỳ sự khác biệt giữapragma OMP song song cho vs pragma OMP song song

#pragma omp parallel for 
for(int i=0; i<N; i++) { 
    ... 
} 

#pragma omp parallel 
for(int i=0; i<N; i++) { 
    ... 
} 

?

Cảm ơn!

+1

Trường hợp thứ hai có mỗi luồng cho cùng một công việc (toàn bộ vòng lặp). Trường hợp đầu tiên chia sẻ công việc giữa các luồng sao cho mỗi luồng thực hiện các phép lặp 'N/t' trong đó' t' là số lượng chủ đề. –

Trả lời

5
#pragma omp parallel 
for(int i=0; i<N; i++) { 
    ... 
} 

Mã này tạo ra một vùng song song và mỗi chuỗi riêng lẻ thực thi những gì có trong vòng lặp của bạn. Nói cách khác, bạn làm vòng lặp hoàn thành N lần, thay vì N luồng tách vòng lặp và hoàn thành tất cả các lần lặp lại chỉ một lần.

Bạn có thể làm:

#pragma omp parallel 
{ 
    #pragma omp for 
    for(int i=0; i < N; ++i) 
    { 
    } 

    #pragma omp for 
    for(int i=0; i < N; ++i) 
    { 
    } 
} 

sẽ tạo ra một vùng song song này (aka một ngã ba/join, mà là tốn kém và do đó bạn không muốn làm điều đó cho mỗi vòng lặp) và chạy nhiều vòng trong song song trong khu vực đó. Chỉ cần chắc chắn rằng nếu bạn đã có một khu vực song song bạn sử dụng #pragma omp for như trái ngược với #pragma omp parrallel for như sau sẽ có nghĩa là mỗi chủ đề N của bạn sinh ra nhiều đề hơn để làm vòng lặp.

+0

Tôi thấy; đó là những gì tôi cần. Vì vậy, tùy chọn đầu tiên ('#pragma omp parallel') sẽ thực thi tổng số Nthreads * N lặp lại, và bất kỳ câu lệnh nào của biểu mẫu' vec [i] = result; 'bên trong vòng lặp sẽ làm mọi thứ lộn xộn. –

+0

@ FranciscoJ.R.Ruiz đúng vậy. Nếu câu trả lời này là câu hỏi của bạn, vui lòng đánh dấu câu trả lời là câu trả lời :) – RyanP

+0

Chắc chắn! Cảm ơn rất nhiều. –

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