以下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);
}
}
你有兩個不同的JC變量。此外,我沒有看到任何理由使用私人(jC)。 –
事實上,'#pragma omp parallel for'在我看來似乎更合理地使用了'#pragma omp parallel for private(jC)'的嵌套... – user3036356