我是 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 并按值传递,它变得更慢。
谢谢你的帮助。