我需要创建一个Eigen数组,其中包含每个源和记录器位置之间的所有距离。
我有三个Eigen::Array,分别表示源位置和记录器位置的sx、sy和sz,以及rx、ry和rz。源和记录器位置数组的长度不一定相同。
使用for循环,我可以按照以下方式计算距离矩阵
Eigen::ArrayXf sx, sy, sz;
Eigen::ArrayXf rx, ry, rz;
Eigen::ArrayXXf dist;
for (int s=0; s<nrSources; s++ ) {
for (int r=0; r<nrReceivers; r++) {
dist(h,g) = sqrt(pow(rx(h)-sx(g),2.)+
pow(ry(h)-sy(g),2.)+
pow(sz(h)-sz(g),2.));
}
}
我需要计算500 x 1000次实验中的dist数组。使用for循环显然可以工作,但这可能不是最有效的方法,因为它没有利用向量化。
将sx、sy、sz和hx、hy和hz重写为sxyz和hxyz数组应该是可能的。
是否有可能更有效地编写方程?
--march=native
、_DNDEBUG
和-O3
以进行更公平的比较。此外,我没有看到您在项目中启用了AVX(除非VS2017默认启用它,这我不知道)。 - Avi Ginsburg_DNDEBUG
,现在已经设置了,结果几乎相同。Eigen比普通实现(使用多线程)慢了约2.5倍。如果你仔细看,你会发现我正在使用GCC 7.3(MinGW64)。MSVC打败了它。我关于AVX的评论是Eigen从中受益不大。 - Royi