【问题标题】:OPENMP Parallel Problem Error for Double Loop双循环的 OPENMP 并行问题错误
【发布时间】:2020-11-23 01:58:35
【问题描述】:

尝试运行时出现错误:“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);
  }

【问题讨论】:

  • 当您说“代码不工作”时,您是什么意思?发生什么了?你得到什么输出?
  • free(): 损坏的未排序块

标签: c++ multithreading parallel-processing openmp


【解决方案1】:

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

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 语句,以帮助矢量化),但除非你的代码中有一些无法解释的约束,否则我认为这个版本是一个好的开始点。

【讨论】:

    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多