2012-06-19 35 views
22

Tôi đang viết một chương trình song song sử dụng OpenMP trong C++.OpenMP set_num_threads() không hoạt động

Tôi muốn kiểm soát số lượng chủ đề trong chương trình bằng cách sử dụng omp_set_num_threads(), nhưng nó không hoạt động.

#include <iostream> 
#include <omp.h> 
#include "mpi.h" 

using namespace std; 

int myrank; 
int groupsize; 
double sum; 
double t1,t2; 
int n = 10000000; 

int main(int argc, char *argv[]) 
{ 
    MPI_Init(&argc, &argv); 
    MPI_Comm_rank(MPI_COMM_WORLD, &myrank); 
    MPI_Comm_size(MPI_COMM_WORLD,&groupsize); 

    omp_set_num_threads(4); 

    sum = 0; 
    #pragma omp for reduction(+:sum) 
    for (int i = 0; i < n; i++) 
     sum+= i/(n/10); 

    cout<<"sum="<<sum<<endl; 
    cout<<"threads="<<omp_get_num_threads()<<endl; 

    MPI_Finalize(); 
    return 0; 
} 

Các đầu ra chương trình:

sum = 4.5e+007 
threads=1 

Làm thế nào để kiểm soát số lượng đề?

Trả lời

69

Bên cạnh việc gọi omp_get_num_threads() ngoài vùng song song trong trường hợp của bạn, hãy gọi omp_set_num_threads() vẫn không đảm bảo rằng thời gian chạy OpenMP sẽ sử dụng chính xác số lượng chỉ định đã chỉ định. omp_set_num_threads() được sử dụng để ghi đè giá trị của biến môi trường OMP_NUM_THREADS và cả hai kiểm soát giới hạn trên trên về kích thước của nhóm chủ đề mà OpenMP sẽ sinh ra cho tất cả các vùng song song (trong trường hợp OMP_NUM_THREADS) hoặc cho bất kỳ khu vực song song nào (sau khi gọi đến omp_set_num_threads()). Có một cái gì đó gọi là đội năng động mà vẫn có thể chọn số lượng nhỏ hơn của chủ đề nếu hệ thống thời gian chạy xét thấy nó thích hợp hơn. Bạn có thể tắt các nhóm động bằng cách gọi omp_set_dynamic(0) hoặc bằng cách đặt biến môi trường OMP_DYNAMIC thành false.

Để thực thi một số lượng nhất định các chủ đề bạn nên vô hiệu hóa đội năng động và xác định số lượng mong muốn của chủ đề với một trong hai omp_set_num_threads():

omp_set_dynamic(0);  // Explicitly disable dynamic teams 
omp_set_num_threads(4); // Use 4 threads for all consecutive parallel regions 
#pragma omp parallel ... 
{ 
    ... 4 threads used here ... 
} 

hoặc với mệnh đề num_threads OpenMP:

omp_set_dynamic(0);  // Explicitly disable dynamic teams 
// Spawn 4 threads for this parallel region only 
#pragma omp parallel ... num_threads(4) 
{ 
    ... 4 threads used here ... 
} 
+0

Nhưng tôi không thể tăng tốc bằng cách thay đổi số lượng chủ đề và cũng bằng cách đặt omp_set_dynamic (0) ?? – Nurlan

+4

Đầu tiên, phiên bản _serial_ mất 50 ms trên CPU của tôi. Bạn không thể mong đợi tăng tốc cho các mã nhanh như vậy vì chi phí OpenMP. Đặt thêm 100x interations trong vòng lặp. Thứ hai, bạn đang thiếu vùng 'song song' trong mã ban đầu của mình. Bạn đã viết '#pragma omp for ...' trong khi nó phải là '#pragma omp song song cho ...'. Thứ ba, bạn đang trộn MPI và OpenMP. Bạn có chắc bạn biết chính xác mình đang làm gì không? –

+0

@HristoIliev người dùng có thể kiểm soát động số lượng chủ đề không? tức là thay vì sử dụng mã cứng '4'. sử dụng một biến? – manatttta

15

Hàm omp_get_num_threads() trả về số lượng chủ đề là hiện tại trong nhóm thực hiện vùng song song mà từ đó nó được gọi là. Bạn đang gọi nó bên ngoài vùng song song, đó là lý do tại sao nó trả về 1.

3

Theo số GCC manual for omp_get_num_threads:

Trong một s tuần tự ection của omp_get_num_threads chương trình trả về 1

Vì vậy, đây:

cout<<"sum="<<sum<<endl; 
cout<<"threads="<<omp_get_num_threads()<<endl; 

nên được thay đổi một cái gì đó như:

#pragma omp parallel 
{ 
    cout<<"sum="<<sum<<endl; 
    cout<<"threads="<<omp_get_num_threads()<<endl; 
} 

Code tôi sử dụng sau lời khuyên của việc vô hiệu hóa các nhóm động Hristo, quá .

2

Tôi đang đối mặt với cùng một vấn đề. Giải pháp được đưa ra dưới đây

Nhấp chuột phải vào Source Program> Properties> Configuration Properties> C/C++> Ngôn ngữ> Bây giờ thay đổi mở MP hỗ trợ cờ để Vâng ....

Bạn sẽ nhận được kết quả mong muốn.