Разное поведение между скалярным и параллельным кодом - PullRequest
3 голосов
/ 01 декабря 2011

Мне интересно, почему следующий код дает разные результаты в своих скалярных и параллельных вариантах:

#define N 10
double P[N][N];
// zero the matrix just to be sure...
for (int i=0; i<N; i++)
    for(int j=0; j<N; j++)
        P[i][j]=0.0;


double xmin=-5.0,ymin=-5.0,xmax=5.0,ymax=5.0;
double x=xmin,y=ymin;
double step= abs(xmax-xmin)/(double)(N - 1 );
for (int i=0; i<N; i++)
{
    #pragma omp parallel for ordered schedule(dynamic)
    for ( int j=0; j<N; j++)
    {
        x = i*step+xmin;
        y = j*step+ymin;
        P[i][j]=x+y;
    }
}

Этот код дает не совсем равные результаты в двух версиях (скалярная версия имеет только #pragma ... часть закомментирована).Я заметил, что очень маленький процент элементов P[i][j] в параллельной версии отличается от скалярной версии, но мне интересно, почему ...

Помещение #pragma во внешнем цикле, как предлагается, беспорядок ... совершенно неверные результаты.

PS g ++ - 4.4, intel i7, linux

1 Ответ

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

Ах, теперь я вижу проблему.В вашем комментарии к последнему вопросу недостаточно контекста, чтобы я мог его увидеть.Но теперь все ясно.

Проблема здесь:

    x = i*step+xmin;
    y = j*step+ymin;

x и y объявлены вне параллельной области, поэтому они используются всеми потоками.(и, следовательно, неприятное состояние расы среди всех потоков ...)

Чтобы исправить это, сделайте их локальными:

for ( int j=0; j<N; j++)
{
    double x = i*step+xmin;
    double y = j*step+ymin;
    P[i][j]=x+y;
}

С этим исправлением вы сможете поместить #pragma на внешнем цикле вместо внутреннего цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...