使用 OpenMP 的特征矩阵操作加速

问题描述 投票:0回答:0

我是 OpenMP 的新手,试图加速以下 for 循环,但我无法获得比顺序计算更快的并行版本。

代码片段如下:

typedef Eigen::Matrix<double, 3, 1, 0, 3 ,1> EigenVector3;
typedef Eigen::Matrix<double, Eigen::Dynamic, 1> VectorX;
std::vector<Constraint*> m_constraints;

class Constraint{
protected:
    unsigned int m_p1, m_p2;
    double m_rest_length;
public:
    EigenVector3 EvaluateDVector(int index,  const VectorX& x);
}

EigenVector3 Constraint::EvaluateDVector(int index,  const VectorX& x)
{
    EigenVector3 x_ij = x.block_vector(m_p1) - x.block_vector(m_p2);
    EigenVector3 di = x_ij.normalized() * m_rest_length;
    return di;
}

void evaluateDVector(  const VectorX& x, VectorX& d)
{
    d.resize(m_constraints.size()*3);
    d.setZero();
   
#pragma omp parallel for
    for (auto index = 0; index < m_constraints.size(); ++index)
    { 
        d.block_vector(index) = m_constraints[index]->EvaluateDVector(index, x);
    }
}

我认为原因是代码没有并行,这只会增加开销。但我不知道是什么原因造成的。

我尝试将 x 指定为 private(x),但 openmp 不允许引用类型为 private,因此我删除了 const ref 并按值传递,它变得更慢。

谢谢你的帮助。

c++ openmp eigen
© www.soinside.com 2019 - 2024. All rights reserved.