首页 > 解决方案 > 双循环的 OPENMP 并行问题错误

问题描述

尝试运行时出现错误:“free():损坏的未排序块”:

#pragma omp parallel for reduction(+:save) shared(save2)
   for (size_t i = 0; i <= N; ++i) {
    vector<float> dist = cdist(i, arestas);
    vector<float> distinv(dist.size());

    for (size_t j = 0; j < N(); ++j) {
      if (arr[j] > 0)
        arrv[j] = (1/N) + (1 / arr[j]);
      else
        arrv[j] = 0;
    }
    save = accumulate(arrv.begin(), arrv.end(), 0.0);
    vector<double>::iterator iter = save2.begin() + i;
    save2.insert(iter, sum);
  }

标签: c++multithreadingparallel-processingopenmp

解决方案


我可能会错过这里的重点,但是以这种方式(未经测试)怎么办?

vector<double> sum2(N);

#pragma omp parallel for num_threads(8)
for ( size_t i = 0; i < N; i++ ) {
    double sum = 0;
    for ( size_t j = 0; j < dist.size(); ++j ) {
        if ( dist[j] > 0 ) {
            sum += 1. / dist[j];
        }
    }
    sum2[i] = sum;
}

这个版本还有一些改进的空间(if例如通过删除语句,以帮助矢量化),但除非你的代码中有一些无法解释的约束,否则我认为这个版本是一个很好的起点。


推荐阅读