2011-11-02 36 views
1

我這是相當耗費時間的函數,它是這樣的,因爲n的值非常大如何並行該功能

sum=0; for(i=0;i<n;i++) 
{ 
    a=func(i,b); 
    c=func(i,a); 
    sum+=c; 
} 

是否可以並行使用OpenMP這個循環?

+0

我們要需要看到更多的代碼。現在,由於您在每次迭代中覆蓋'c',代碼不會執行任何操作。 – Mysticial

+0

執行此操作時,確保'func'在被多個線程調用時是可重入的。 – evnu

+0

你已經完全改變了你的問題。我建議你提出一個新問題,然後將這個問題還原爲原始問題。所以我會分開回答。 – Mysticial

回答

4

以下是簡短的方式:

int sum = 0; 

#pragma omp parallel for reduction(+:sum) 
    for(i = 0; i < n; i++){ 
     int a = func(i,b); 
     int c = func(i,a); 
     sum += c; 
    } 

這裏有一個較長的(更靈活)的方式:

int sum = 0; 

#pragma omp parallel 
    { 
     int local_sum = 0; 

#pragma omp for 
     for(i = 0; i < n; i++){ 
      a = func(i,b); 
      c = func(i,a); 
      local_sum += c; 
     } 

#pragma omp critical 
     { 
      sum += local_sum; 
     } 
    } 
+0

謝謝你神祕:)是否有可能將它用於數組呢?說我想它是總和[我] = C ?? – user1019083

+0

是的。如果每次迭代都寫入目標數組的不同元素,則根本不需要「簡化」或同步。 (如果這回答你的問題,你可以通過點擊綠色的複選標記來接受我的答案,你之前的問題也是如此。) – Mysticial

+0

神祕的,我修改了一下問題,我嘗試着去處理它,但是沒能你請幫我在這裏 – user1019083