【发布时间】:2019-10-26 02:29:09
【问题描述】:
我正在寻找使用 Eigen 进行简单操作的最快方法。有这么多可用的数据结构,很难说哪个是最快的。
我尝试过预定义我的数据结构,但即便如此,我的代码仍被类似的 Fortran 代码所超越。我猜 Eigen::Vector3d 是满足我需求的最快的,(因为它是预定义的),但我很容易出错。在编译期间使用 -O3 优化给了我很大的提升,但我的运行速度仍然比相同代码的 Fortran 实现慢 4 倍。
我使用“原子”结构,然后将其存储在由以下定义的“原子”向量中:
struct Atom {
std::string element;
//double x, y, z;
Eigen::Vector3d coordinate;
};
std::vector<Atom> atoms;
我的代码中最慢的部分如下:
distance = atoms[i].coordinate - atoms[j].coordinate;
distance_norm = distance.norm();
我可以使用更快的数据结构吗?或者有没有更快的方法来执行这些基本操作?
【问题讨论】:
-
您可以尝试使用
-ffast-math进行编译(如果您使用的是 gcc 或 clang)。您可以从#include <unsupported/Eigen/AlignedVector3>尝试Eigen::AlignedVector3<double>。还要确保使用-DNDEBUG进行编译(一旦您验证您的代码工作正常)。但是要回答“最快”是什么,需要更多的上下文。 -
-ffast-math 让我的速度比 -O3 快 40 倍!
-
有趣的是,我单独使用 -fno-math-errno 选项(只是 --fast-math 启用的几个选项之一)获得了 40 倍的加速。
-
对于像我这样的其他 c++ 新手。通过删除对“pow”的调用,我得到了数量级的加速。例如pow(x,2) --> x_2 = x*x, pow(x,6) = x_2*x_2*x_2