首页 > 解决方案 > I don't know what is wrong with this loop parallelization

问题描述

I do not know why, but the parallelization of this loop is not working fine:

#pragma omp parallel for private(d) 
for ( i = 0 ; i < nt1 ; i++ ) {
  d = distancia(tabla1[i],tabla2[j]);
  if ( d < dm ) {
    #pragma omp critical
    if ( d < dm ) {
      dm = d;
      im = i;
    }
  }
}
ps[j] = im;

The d variable is private and the dm and im are inside a critical zone but when I exec this code (the full code is bigger, this is just a small part of it) the output changes from the sequential version. Thanks!

标签: cparallel-processingopenmp

解决方案


我相信问题在于,即使它是一个临界区,在顺序版本中我们总是会得到最低i值并添加这个条件:(dm == d && i < im)在条件中我们确保代码仍然以相同的方式工作。我不确定这是否是最好的解决方案,但它非常简单并且对我有用。这是包含更改的完整代码:

for ( j = 0 ; j < nt2 ; j++ ) {
  dm = MAX_LON + 1;
  #pragma omp parallel for private(d) 
  for ( i = 0 ; i < nt1 ; i++ ) {
    d = distancia(tabla1[i],tabla2[j]);
    if ( d < dm  || (dm == d && i < im)) {
      #pragma omp critical
        {
        if ( d < dm  || (dm == d && i < im)) {
          dm = d;
          im = i;
        }
        }
    }
  }
  ps[j] = im;
}

推荐阅读