Идентификация состояния гонки для сложного кода openMP - PullRequest
1 голос
/ 16 декабря 2011

Этот блок кода openMP работает нормально, но я должен убедиться, что нет условий гонки. Поэтому я сделал переменную j закрытой.

Делая это, я не думаю, что должно существовать какое-либо условие гонки для операции присваивания в самом внутреннем цикле. Пожалуйста, поправьте меня, если я ошибаюсь.

#pragma omp parallel for private(i,j,k) shared (result_buffer,trans_a,element_b)
for (i=0; i<N; i++)
result_buffer[i]=0; 
{   
    for (j = 0; j<(N/comm_size); j++)
    {               
            for(k=0; k<N; k++)
            result_buffer[k]=result_buffer[k]+trans_a[j*N+k]*element_b[j];
    }               
 } 

1 Ответ

2 голосов
/ 16 декабря 2011

Ну, одна проблема сейчас заключается в том, что ваш "внешний цикл" не является внешним циклом, потому что у вас нет {} в правильном месте.

Таким образом, в этом смысле у вас нет состояния гонки, потому что pragma будет применяться только к этому:

for (i=0; i<N; i++)
    result_buffer[i]=0;

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


Если не считать, что вы хотели, чтобы ваш код был таким:

for (i=0; i<N; i++)
    result_buffer[i]=0; 

#pragma omp parallel for private(i,j,k) shared (result_buffer,trans_a,element_b)
for (j = 0; j<(N/comm_size); j++)
{               
    for(k=0; k<N; k++)
        result_buffer[k]=result_buffer[k]+trans_a[j*N+k]*element_b[j];
}               

Тогда да, у вас будет состояние гонки.

Ваш внутренний цикл изменяет весь массив result_buffer. Все итерации внешнего цикла также будут конфликтовать с одним и тем же набором данных. Итак, будет состояние гонки.

В нынешнем виде единственный параллелизуемый цикл - это самый внутренний цикл.

...