2011-09-14 8 views
11

Tôi đang sử dụng OpenMP để cải thiện hiệu quả chương trình của mình trên các vòng lặp.OpenMP: sử dụng có điều kiện #pragma

Nhưng gần đây tôi phát hiện ra rằng trên các vòng nhỏ, việc sử dụng thư viện này đã giảm hiệu suất và sử dụng cách thông thường tốt hơn.

Trong thực tế, tôi muốn sử dụng OpenMP chỉ khi một điều kiện được thỏa mãn, mã của tôi là

#pragma omp parallel for 
for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 

Nhưng những gì tôi muốn làm là để vô hiệu hóa #pragma nếu kích thước đủ nhỏ ví dụ:

if (size > OMP_MIN_VALUE) 
    #pragma omp parallel for 
for (unsigned i = 0; i < size; ++i) 
do_some_stuff(); 

nhưng không hoạt động, cách tốt hơn là viết vòng lặp hai lần nhưng tôi không muốn làm như vậy ...

if (size > OMP_MIN_VALUE) 
{ 
    #pragma omp parallel for 
    for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 
} 
else 
{ 
    for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 
} 

Cách tốt hơn để làm điều đó là gì?

Trả lời

7

Tôi nghĩ rằng bạn sẽ có thể đạt được hiệu quả bạn đang tìm kiếm bằng cách sử dụng các tùy chọn schedule clause trên parallel for chỉ thị của bạn:

#pragma omp parallel for schedule(static, OMP_MIN_VALUE) 
for (unsigned i = 0; i < size; ++i) 
    do_some_stuff(); 

Bạn có thể muốn chơi xung quanh với các loại khác nhau của lịch dù và khác nhau kích thước chunk để xem những gì phù hợp với thói quen thư viện của bạn tốt nhất.

+11

Tôi đã sử dụng song song #pragma omp cho if (size> = OMP_MIN_VALUE) – Arthur