【发布时间】:2018-06-20 16:38:59
【问题描述】:
对于一个非常简单的测试示例,当尝试在 OpenMP 构造中填充 Eigen::SparseMatrix 时,应用程序崩溃。
SparseMatrix<double> A_mat( nCol, nRow );
//A_mat.reserve( VectorXi::Constant( nCol, nRow ) ); // When commented crashes
auto numThreads = omp_get_max_threads();
#pragma omp parallel for num_threads( numThreads )
for ( int j = 0; j < nCol; ++j )
{
for ( int i = 0; i < nRow; ++i )
{
if ( i >= j )
{
double val = i * nCol + j;
A_mat.insert( i, j ) = val;
}
}
}
仅当我使用1 线程时,此代码才会按预期运行。但是,当使用多个线程运行时,会引发以下错误:
double free or corruption (!prev)
double free or corruption (!prev)
double free or corruption (!prev)
double free or corruption (top)
double free or corruption (!prev)
double free or corruption (out)
当我取消注释以下行时:
A_mat.reserve( VectorXi::Constant( nCol, nRow ) );
然后上面给定的代码块即使在使用多个线程运行时也会再次产生预期的结果。
有人可以向我解释为什么会这样吗?
【问题讨论】:
-
这是否符合稀疏矩阵的条件?它看起来更像三角形。
-
为了这个例子没关系。我可以用任何其他方式填写它。
标签: c++ sparse-matrix eigen eigen3