Ну, одна проблема сейчас заключается в том, что ваш "внешний цикл" не является внешним циклом, потому что у вас нет {}
в правильном месте.
Таким образом, в этом смысле у вас нет состояния гонки, потому что 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
. Все итерации внешнего цикла также будут конфликтовать с одним и тем же набором данных.
Итак, будет состояние гонки.
В нынешнем виде единственный параллелизуемый цикл - это самый внутренний цикл.