[英]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.