嵌套 for 循环的 openmp 出错

Error with openmp for Nested for-loop

本文关键字:openmp 出错 循环 for 嵌套      更新时间:2023-10-16

我在面向对象的cpp代码中使用了特征库。我定义了一个主要对象 2DGF,并且在它的某些方法中,我使用了 openmp。现在我想在另一种方法中使用 openmp,如下所示:

#pragma omp parallel num_threads(NON) 
   #pragma omp for 
for(unsigned int iE=0;iE<NE;iE++){
   for(unsigned int iK=0;iK<NK;iK++){
      for(unsigned int ii=0; ii<NL ;ii++){
          for(unsigned int jj=0; jj<NL ;jj++){
              if(abs(CoorX[ii]-CoorX[jj])<DiogLim){
                 G.insert(iE*NL+ii,iK*NL+jj)=0;
                 GR.insert(iE*NL+ii,iK*NL+jj)=0;
                 S.insert(iE*NL+ii,iK*NL+jj)=0;   
                 SR.insert(iE*NL+ii,iK*NL+jj)=0;   
              }
          }
       }
    }
}  

其中 G、GR、S 和 SR 是稀疏矩阵。不使用 openmp,它可以毫无问题地工作。但是当我使用 openmp 时,我收到以下错误:
2DGF : malloc.c:2372: sysmalloc: 断言 '(old_top == (((mbinptr) (((char *) &((av)->bins[(1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) ||((unsigned long) (old_size)>= (unsigned long)(((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) &&((unsigned long) old_end & pagemask) == 0)' 失败。
已中止(核心已转储)

有人可以帮助我修复它吗?

我对Eigen了解不多。但我在他们的文档中读了一些关于SparseMatrix的方法insert(),它说它对其他插入reserving room。您是否为所有插件预留了足够的空间?

如果不是,则可能是以下代码中存在的相同错误。

#include <iostream>
#include <vector>
#include <omp.h>
int main()
{
    std::vector< int > vInts;
#pragma omp parallel for
    for (int i = 0; i < 1000; i++) {
        vInts.push_back( i );
    }
    return 0;
}

这也可能以分段错误告终。原因是向量被重新定位到不同的区域 int 内存。可以通过为矢量保留足够的内存来避免这种情况。在这种情况下vInts.reserve(1000).

SparseMatrix也提供了一种保留方法。试试这个,至少要排除它作为一个可能的错误。

编辑:这是带有 for 循环的代码,并在最里面的循环中分配了一个简单的赋值。该程序使用g++ -fopenmp -Wall -Werror main.cpp编译,没有错误或警告。程序正常执行,输出为 i=99。

#include <iostream>
#include <omp.h>
#include <vector>
#define NON 3
int main()
{
    int i = 0;
    unsigned int NE = 100;
    unsigned int NK = 100;
    unsigned int NL = 100;
#pragma omp parallel num_threads(NON) 
        #pragma omp for 
    for(unsigned int iE=0;iE<NE;iE++){
       for(unsigned int iK=0;iK<NK;iK++){
          for(unsigned int ii=0; ii<NL ;ii++){
              for(unsigned int jj=0; jj<NL ;jj++){
                  i = jj;
              }
           }
        }
    } 
return 0;
}