2013-11-26 78 views
1

以下C++函數片段最初編寫爲串行代碼。 爲了將外部循環與計數器'jC'並行化,我只是添加了「專用(#jp)#pragma omp parallel」行。儘管這種天真的方法對我有很多幫助,但我懷疑是否足以並行化jC循環,因爲執行時間似乎與原始代碼相比沒有變化。 有沒有人提供一些建議,以確保以下代碼被有效轉換爲(正確)並行代碼?如何將具有串行內部循環的openMP與外部循環並行添加數組

如果我的問題不是很好地提前致謝,我很抱歉(這是我在這個論壇的第一篇文章)。

的代碼片段是:

#include "omp.h" 

void addRHS_csource_to_pcellroutine_par(
      double *srcCoeff, double *srcVal, int nPc, 
      double *adata, double *bdata, int elsize 
      ) 
{ int elamax = elsize*elsize; 
    int jC; 
    #pragma omp parallel for private(jC) 
    for (int jC=0; jC<nPc; jC++) { 
     for (int el=0; el<elamax; el++) { 

       adata[el + jC*elamax] = adata[el + jC*elamax] - srcCoeff[el + jC*elamax]; 
     } 

     for (int el=0; el<elsize; el++) { 

       bdata[el + jC*elsize] = bdata[el + jC*elsize] + srcVal[el + jC*elsize]; 

     } 

    } 
} 

附加說明:一個(?可能不是最優雅的)的方式來解決它,包括改變編寫成

void addRHS_csource_to_pcellroutine_parFunction(int jC, int elamax, 
      double *srcCoeff, double *srcVal, int nPc, 
      double *adata, double *bdata, int elsize 
      ) 
{ 
    for (int el=0; el<elamax; el++) { 

     adata[el + jC*elamax] -= srcCoeff[el + jC*elamax]; 
    } 

    for (int el=0; el<elsize; el++) { 

     bdata[el + jC*elsize] += srcVal[el + jC*elsize]; 

    } 

} 

void addRHS_csource_to_pcellroutine_par(
      double *srcCoeff, double *srcVal, int nPc, 
      double *adata, double *bdata, int elsize 
      ) 
{ int elamax = elsize*elsize; 
    #pragma omp parallel for 
    for (int jC=0; jC<nPc; jC++) { 
     addRHS_csource_to_pcellroutine_parFunction(jC, elamax, srcCoeff, srcVal, nPc, adata, bdata, elsize); 
    } 

} 
+0

你有兩個不同的JC變量。此外,我沒有看到任何理由使用私人(jC)。 –

+0

事實上,'#pragma omp parallel for'在我看來似乎更合理地使用了'#pragma omp parallel for private(jC)'的嵌套... – user3036356

回答

1

,你可以的請閱讀specifcation(第55頁) 您的內部循環不是並行化的。只有外面的一個是。

int jC; 
#pragma omp parallel for private(jC) 
for (int jC=0;...... 

您已經定義了兩個名爲jC的變量。你究竟想要做的是正確的,但如果你決定了一個解決方案:

int jC; 
#pragma omp parallel for private(jC) 
for(jC = 0;.... 

#pragma omp parallel for 
for(int jC = 0;.... 

至於:

我懷疑它是否足以並行化JC環, ,因爲執行時間似乎 相對於原始代碼不變。

充足率取決於您必須做的迭代次數(由nPc給出)以及您提供的線程數(合理地在四核8線程上)。 你甚至可以得到較慢的並行化循環。這是因爲創建新線程的開銷很高(還有其他一些額外的東西,如管理線程)。

因此,您必須通過並行化循環來獲得更多時間,而不是需要創建線程。

希望這回答你的問題。

如果仍然NEDD更快PROGRAMM你可以考慮一下的算法並行藏漢內部循環(例如,通過分割迭代空間和使用OpenMP reduction結構)

相關問題