2012-02-22 37 views
13

Hi chỉ cần tự hỏi nếu điều này là đúng cách để đi về việc có một vòng lặp thường xuyên nhưng với hai giảm, đây có phải là phương pháp tiếp cận bên dưới? Điều này sẽ làm việc với nhiều hơn sau đó hai giảm là tốt. Có cách nào tốt hơn để làm điều này? cũng có cơ hội để tích hợp điều này với lệnh MPI_ALLREDUCE không?openmp song song cho vòng lặp với hai hoặc nhiều hơn cắt giảm

heres the psuedo code 

     #pragma omp parallel for \ 
     default(shared) private(i) \ 
     //todo first reduction(+:sum) 
     //todo second reduction(+:result) 

     for loop i < n; i ++; { 
     y = fun(x,z,i) 
     sum += fun2(y,x) 
     result += fun3(y,z) 
     } 

Trả lời

19

Bạn có thể làm giảm bằng cách xác định nhiều hơn một biến cách nhau bởi một dấu phẩy, tức là một danh sách:

#pragma omp parallel for default(shared) reduction(+:sum,result) ...

biến chủ đề cá nhân sẽ được tạo cho sumresult rằng sẽ được kết hợp sử dụng + và được gán cho các biến toàn cầu ban đầu ở cuối khối chuỗi.

Ngoài ra, biến số y phải được đánh dấu là riêng tư.

Xem https://computing.llnl.gov/tutorials/openMP/#REDUCTION

+0

thank you very much – pyCthon

+1

gì nếu có những hoạt động khác nhau được thực hiện ví dụ '+' và 'max'? – worenga

+1

@mightyuhu Xem câu trả lời của tôi – Azmisov

3

Bạn chỉ có thể thêm một reduction khoản:

#include <iostream> 
#include <cmath> 

int main(){ 
    double sum_i = 0, max_i = -1; 
    #pragma omp parallel for reduction(+:sum_i), reduction(max:max_i) 
    for (int i=0; i<5000; i++){ 
     sum_i += i; 
     if (i > max_i) 
      max_i = i; 
    } 
    std::cout << "Sum = " << sum_i << std::endl; 
    std::cout << "Max = " << max_i << std::endl; 
    return 0; 
} 
+0

Nó không hoạt động trong GCC 7.1. Bất kỳ ý tưởng làm thế nào để áp dụng 2 giảm khác nhau? – Royi

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