c – 使用OpenMP和Eigen会导致无限循环/死锁

前端之家收集整理的这篇文章主要介绍了c – 使用OpenMP和Eigen会导致无限循环/死锁前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在解决一个更大的问题,并遇到一个错误,当我尝试使用OpenMP并行化一些循环.我已经使用模拟我自己的代码的一些更简单的代码重现了这个问题.

问题是当我运行程序时,它会随机地进入某种无限循环/死锁(cpu为100%,但不做任何事情).从我可以从我的测试中可以看出,其中一个线程尝试计算矩阵矩阵乘积,但是由于某种原因而无法完成.

我知道如果您启用OpenMP,Eigen将使用OpenMP并行化矩阵矩阵产品.我也在此之外添加了另一个并行循环.但是,如果通过定义EIGEN_DONT_PARALLELIZE禁用Eigen的并行化,则仍然会出现此错误.

我使用gcc版本4.6.0 20101127在MacOS 10.6.8与Eigen 3.0.4.

我不知道会发生什么错误

#include <iostream>
#include <Eigen/Core>

using namespace std;
using namespace Eigen;

MatrixXd Test(MatrixXd const& F,MatrixXd const& G)
{
  MatrixXd H(F.rows(),G.cols());
  H.noalias() = F*G;

  return H;
}

int main()
{
  MatrixXd F = MatrixXd::Random(2,2);
  MatrixXd G = MatrixXd::Random(2,2);

  #pragma omp parallel for
  for (unsigned int i = 0; i < 10000; ++i)
    MatrixXd H = Test(F,G);

  cout << "Done!" << endl;
}

解决方法

经过一些调试,我认为问题位于Eigen.在文件src / core / products / GeneralBlockPanelKernel.h中有一个名为manage_caching_sizes的函数,它声明两个静态变量:
static std::ptrdiff_t m_l1CacheSize = 0;
static std::ptrdiff_t m_l2CacheSize = 0;

将其更改为:

static std::ptrdiff_t m_l1CacheSize = 0;
static std::ptrdiff_t m_l2CacheSize = 0;
#pragma omp threadprivate(m_l1CacheSize,m_l2CacheSize)

解决了我的问题

猜你在找的C&C++相关文章