2011-10-05 35 views
6

Tại sao trình biên dịch intel không cho phép tôi chỉ định rằng một số hành động trong khối openmp parallel for chỉ nên được thực hiện bởi chuỗi chủ?pragma "master" OpenMP không được kèm theo "pragma" song song cho "pragma

Và làm cách nào tôi có thể làm những gì tôi đang cố gắng đạt được mà không có loại chức năng này?

Những gì tôi đang cố gắng để làm cập nhật là một thanh tiến trình thông qua một callback trong một song song cho:

long num_items_computed = 0; 

#pragma omp parallel for schedule (guided) 
for (...a range of items...) 
{ 
    //update item count 
    #pragma omp atomic 
     num_items_computed++; 

    //update progress bar with number of items computed 
    //master thread only due to com marshalling 
    #pragma omp master 
     set_progressor_callback(num_items_computed); 

    //actual computation goes here 
    ...blah... 
} 

Tôi muốn những sợi chỉ tổng thể để gọi gọi lại, vì nếu tôi không thi hành mà (nói bằng cách sử dụng omp critical thay vì để đảm bảo chỉ có một thread sử dụng gọi lại cùng một lúc) tôi nhận được ngoại lệ thời gian chạy sau:

The application called an interface that was marshalled for a different thread. 

... do đó mong muốn giữ tất cả các callbacks trong chủ đề tổng thể.

Xin cảm ơn trước.

Trả lời

6
#include <omp.h> 
void f(){} 
int main() 
{ 
#pragma omp parallel for schedule (guided) 
    for (int i = 0; i < 100; ++i) 
    { 
     #pragma omp master 
     f(); 
    } 
    return 0; 
} 

Lỗi trình biên dịch C3034 OpenMP 'thầy' chỉ thị không thể được lồng vào nhau trực tiếp trong 'song song cho' chỉ thị Visual Studio 2010 OpenMP 2,0

Có thể là như vậy:

long num_items_computed = 0; 

#pragma omp parallel for schedule (guided) 
for (...a range of items...) 
{ 
    //update item count 
    #pragma omp atomic 
     num_items_computed++; 

    //update progress bar with number of items computed 
    //master thread only due to com marshalling 
    //#pragma omp master it is error 
    //#pragma omp critical it is right 
    if (omp_get_thread_num() == 0) // may be good 
     set_progressor_callback(num_items_computed); 

    //actual computation goes here 
    ...blah... 
} 
+0

Điều này dường như đang hoạt động, cảm ơn bạn. Tôi đã lo lắng rằng các chủ đề tổng thể có thể khác nhau cho tất cả các chủ đề công nhân ... để gọi lại sẽ không bao giờ thực hiện ... là có thể tưởng tượng trong spec spec omp? –

+0

Nếu số lần lặp lại lớn thì bạn sẽ không nhận thấy sự khác biệt. Và sau khi thêm vòng lặp: if (omp_get_thread_num() == 0) set_progressor_callback (num_items_computed); –

+0

từ standart OpenMP về pragma omp song song cho(): "Cấu trúc vòng lặp xác định rằng các vòng lặp của một hoặc nhiều vòng liên kết sẽ được thực thi song song với các luồng trong nhóm trong bối cảnh các nhiệm vụ ngầm của chúng.Các vòng lặp được phân phối trên các luồng đã tồn tại trong nhóm thực hiện vùng song song mà vùng vòng lặp liên kết. " –

3

Lý do tại sao bạn nhận được lỗi là bởi vì các chủ đề chủ yếu là không có hầu hết các lần khi mã đạt đến #pragma omp master dòng. Ví dụ, chúng ta hãy mã từ Artyom:

#include <omp.h> 
void f(){} 
int main() 
{ 
#pragma omp parallel for schedule (guided) 
    for (int i = 0; i < 100; ++i) 
    { 
     #pragma omp master 
      f(); 
    } 
    return 0; 
} 

Nếu mã sẽ biên dịch, sau đây có thể xảy ra:

Hãy nói rằng chủ đề 0 bắt đầu (thread chính). Nó đạt đến pragma thực tế nói "Sư phụ, làm đoạn mã sau đây". Nó là người chủ có thể chạy hàm. Tuy nhiên, điều gì sẽ xảy ra khi chuỗi 1 hoặc 2 hoặc 3, v.v., đạt đến đoạn mã đó?

Chỉ thị chính sẽ thông báo cho đội hiện tại/nghe rằng chuỗi chính phải thực hiện f(). Nhưng nhóm nghiên cứu là một chủ đề duy nhất và không có hiện tại chủ. Chương trình sẽ không biết phải làm gì qua thời điểm đó.

Và đó là lý do tại sao, tôi nghĩ, chủ nhân không được phép ở bên trong vòng lặp.

Thay thế master directive bằng if (omp_get_thread_num() == 0) hoạt động vì bây giờ chương trình nói, "Nếu bạn là chủ, hãy làm điều này. Nếu không thì hãy bỏ qua".

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