我有以下代碼:減少變量是外上下文私人
void simulation (MD *md){
double sum;
#pragma omp parallel private (move)
{
for(move = 0; move < maxIterations; ++move)
{
cicleDoMove(md);
cicleForces(md);
cicleMkekin(md,sum);
// ...
}
}
}
其中:
void cicleMkekin(Md *md, double sum){
#pragma omp for reduction(+ : sum)
for (i = 0; i < md->mdsize; i++)
{
sum += mkekin(..);
}
// ..
}
我得到了以下錯誤:
"reduction variable 'sum' is private in outer context"
把變量SUM共享不是私人的,實際上如果我將模擬代碼更改爲:
void simulation (MD *md){
double sum;
#pragma omp parallel private (move)
{
for(move = 0; move < maxIterations; ++move)
{
cicleDoMove(md);
cicleForces(md);
#pragma omp for reduction(+ : sum)
for (i = 0; i < md->mdsize; i++)
{
sum += mkekin(..);
}
// ...
}
}
}
它完美地工作。
是否有反正我可以使用我的第一個代碼版本沒有得到那個錯誤?或者我做錯了什麼?
您正將'sum'按值傳遞給'cicleMkekin' - 在這種情況下,它不可能是一個共享變量,因爲'cicleMkekin'在每個線程中都接收到一個單獨的值 - 副本。 – 2014-12-04 07:44:09
是的,我第一次嘗試通過引用傳遞,但我不能用它在還原函數。我知道這個錯誤是有道理的,我只是在尋找一些不會使用錯誤共享的解決方法。無論如何,我最終都會使用所有線程共享的數組。我將刪除「在我看來,OpenMp認爲論點是私人的或某些東西」這是沒有意義的。 – dreamcrash 2014-12-04 22:08:36