У меня есть следующий код:Критическая секция внутри для цикла в OpenMP
#pragma omp parallel for private(dist,i,j)
for(k=0;k<K;k++)
{
//some code
for(i=0;i<N;i++)
{
#pragma omp critical
{
if(min_dist[i]>dist[i])//The point i belongs to the cluster k
{
newmembership[i]=k;
min_dist[i]=dist[i];
}
}
dist[i]=0;
}
}
расстояния является частным переменным, тогда как newmemebership и Min_Dist является общей variable.For моего теста кода все еще работает, если мы запустим код без добавления конструкции критического сечения. Насколько я понимаю, это не должно быть, поскольку два потока могут выполняться с одинаковым значением i и могут изменять min_dist [i] и newmembership [i], приводящие к конфликту.
Пожалуйста, объясните, нужно ли добавить конструкцию критического сечения, а также есть ли лучший способ реализовать выше, т.е. использовать блокировки или семафоры?
Пожалуйста, сделайте привычку из включая декларации ** все ссылочное переменные ** , Еще лучше включить фактический [mcve]. – Zulan