Как правильно распараллелить вложенные циклы - PullRequest
7 голосов
/ 01 декабря 2011

Я работаю с OpenMP для распараллеливания скалярного вложенного цикла for:

double P[N][N];
double x=0.0,y=0.0;

for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction(x,y);
        y+=1;
    }
    x+=1;
}

В этом цикле важно то, что матрица P должна быть одинаковой как в скалярной, так и в параллельной версиях:

Все мои возможные испытания не увенчались успехом ...

1 Ответ

13 голосов
/ 01 декабря 2011

Проблема в том, что вы добавили зависимости от итерации к итерации с помощью:

x+=1;
y+=1;

Поэтому, поскольку код стоит прямо сейчас, он не распараллеливается.Попытка сделать это приведет к неверным результатам.(как вы, вероятно, видите)

К счастью, в вашем случае вы можете напрямую вычислить их, не вводя эту зависимость:

for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction((double)i, (double)N*i + j);
    }
}

Теперь вы можете попробовать бросить над этим прагму OpenMP и посмотретьесли это работает:

#pragma omp parallel for
for (int i=0; i<N; i++)
{
    for (int j=0; j<N; j++)
    {
        P[i][j]=someLongFunction((double)i, (double)N*i + j);
    }
}
...