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.
Đ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? –
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); –
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. " –