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++) {
...
}
và
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
?
Cảm ơn!
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++) {
...
}
và
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
?
Cảm ơn!
#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.
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. –
@ 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
Chắc chắn! Cảm ơn rất nhiều. –
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ủ đề. –