我在面向对象的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;失败。
中止(核心倾倒)
愿任何人帮我解决这个问题吗?
答案 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;
}