嵌套for循环的openmp出错

时间:2015-06-13 06:09:26

标签: c++ parallel-processing openmp

我在面向对象的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 *)&amp;((av) - &gt; bins [((1) - 1)* 2])) - __builtin_offsetof(struct malloc_chunk,fd))))&amp;&amp; old_size == 0)|| ((unsigned long)(old_size)&gt; =(unsigned long)(((__ builtin_offsetof(struct malloc_chunk,fd_nextsize))+((2 *(sizeof(size_t))) - 1))&amp;〜((2 * (sizeof(size_t))) - 1)))&amp;&amp;((old_top) - &gt; size&amp; 0x1)&amp;&amp;((unsigned long)old_end&amp; pagemask)== 0)&#39;失败。
中止(核心倾倒)

愿任何人帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我对Eigen知之甚少。但我在他们的documentation中读了一下 关于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;
}

这也可能以分段错误结束。原因是向量被重定位到内存中的不同区域。这可以通过为向量保留足够的内存来避免。在这种情况下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;
}