11

我正在解决一个更大的问题,当我尝试使用 OpenMP 并行化一些循环时遇到了一个错误。我用下面一些更简单的代码重现了这个问题,这些代码模仿了我自己的代码。

问题是当我运行程序时,它会随机进入某种无限循环/死锁(CPU 是 100%,但什么也不做)。从我的测试中可以看出,其中一个线程尝试计算矩阵-矩阵乘积,但由于某种原因从未完成。

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

我在带有 Eigen 3.0.4 的 MacOS 10.6.8 上使用 gcc 版本 4.6.0 20101127。

我无法弄清楚可能出了什么问题...

#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;
}
4

3 回答 3

11

经过一番调试,我认为问题出在 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)

解决了我的问题。

于 2012-01-12T19:07:27.820 回答
2

即使使用最新版本的 Eigen (3.0.5),我也遇到了同样的问题。我尝试了上面提出的修复程序,但由于新的初始化程序,3.0.5 版不可能。所以我做了以下更改:

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

if (m_l1CacheSize==0)
{
    m_l1CacheSize = manage_caching_sizes_second_if_negative(queryL1CacheSize(),8 * 1024);
    m_l2CacheSize = manage_caching_sizes_second_if_negative(queryTopLevelCacheSize(),1*1024*1024);
}

解决了我的问题。

于 2012-05-10T18:23:42.010 回答
2

我在使用 Microsoft Visual Studio 2010 SP1 PPL/parallel_for 时遇到了同样的问题。解决方案描述于

http://eigen.tuxfamily.org/dox/TopicMultiThreading.html

在多线程应用程序中使用 Eigen

如果您自己的应用程序是多线程的,并且多个线程调用 Eigen,那么您必须在创建线程之前通过调用以下例程来初始化 Eigen:

#include <Eigen/Core>

int main(int argc, char** argv)
{
  Eigen::initParallel();

  ...
}

如果您的应用程序与 OpenMP 并行化,您可能希望禁用 Eigen 自己的并行化,如上一节所述。

于 2012-08-26T12:31:25.670 回答