繁体   English   中英

嵌套循环的openmp错误

[英]Error with openmp for Nested for-loop

我在面向对象的cpp代码中使用了Eigen库。 我定义了一个主要对象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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM