Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;快速求解线性系统的特征值法 所以我想测试C++和Matlab的速度来求解一个线性方程组。为此,我创建了一个随机系统,并使用Visual Studio上的Eigen测量求解该系统所需的时间: #include <Eigen/Core> #include <Eigen/Dense> #include <chrono> using namespace Eigen; using namespace std; int main() { chrono::steady_clock sc; // create an object of `steady_clock` class int n; n = 5000; MatrixXf m = MatrixXf::Random(n, n); VectorXf b = VectorXf::Random(n); auto start = sc.now(); // start timer VectorXf x = m.lu().solve(b); auto end = sc.now(); // measure time span between start & end auto time_span = static_cast<chrono::duration<double>>(end - start); cout << "Operation took: " << time_span.count() << " seconds !!!"; }_C++_Visual Studio_Matlab_Benchmarking_Eigen - Fatal编程技术网

C++;快速求解线性系统的特征值法 所以我想测试C++和Matlab的速度来求解一个线性方程组。为此,我创建了一个随机系统,并使用Visual Studio上的Eigen测量求解该系统所需的时间: #include <Eigen/Core> #include <Eigen/Dense> #include <chrono> using namespace Eigen; using namespace std; int main() { chrono::steady_clock sc; // create an object of `steady_clock` class int n; n = 5000; MatrixXf m = MatrixXf::Random(n, n); VectorXf b = VectorXf::Random(n); auto start = sc.now(); // start timer VectorXf x = m.lu().solve(b); auto end = sc.now(); // measure time span between start & end auto time_span = static_cast<chrono::duration<double>>(end - start); cout << "Operation took: " << time_span.count() << " seconds !!!"; }

C++;快速求解线性系统的特征值法 所以我想测试C++和Matlab的速度来求解一个线性方程组。为此,我创建了一个随机系统,并使用Visual Studio上的Eigen测量求解该系统所需的时间: #include <Eigen/Core> #include <Eigen/Dense> #include <chrono> using namespace Eigen; using namespace std; int main() { chrono::steady_clock sc; // create an object of `steady_clock` class int n; n = 5000; MatrixXf m = MatrixXf::Random(n, n); VectorXf b = VectorXf::Random(n); auto start = sc.now(); // start timer VectorXf x = m.lu().solve(b); auto end = sc.now(); // measure time span between start & end auto time_span = static_cast<chrono::duration<double>>(end - start); cout << "Operation took: " << time_span.count() << " seconds !!!"; },c++,visual-studio,matlab,benchmarking,eigen,C++,Visual Studio,Matlab,Benchmarking,Eigen,根据反斜杠运算符的此流程图: 假定随机矩阵不是三角形、置换三角形、厄米或上海森堡,在MATLAB中使用反斜杠算子,LU求解器,我相信是与C++代码相同的解算器,也就是()。 也许我缺少了一些东西,因为我认为C++更快。 我在Configuration Manager上以激活的释放模式运行它 项目属性-C/C++-优化-/O2处于活动状态 尝试使用增强指令(SSE和SSE2)。苏格兰和南方能源公司实际上让它变慢了,而苏格兰和南方能源公司2号几乎没有任何区别 我正在使用社区版的VisualStu

根据反斜杠运算符的此流程图:

假定随机矩阵不是三角形、置换三角形、厄米或上海森堡,在MATLAB中使用反斜杠算子,LU求解器,我相信是与C++代码相同的解算器,也就是<代码>()。 也许我缺少了一些东西,因为我认为C++更快。

  • 我在Configuration Manager上以激活的释放模式运行它
  • 项目属性-C/C++-优化-/O2处于活动状态
  • 尝试使用增强指令(SSE和SSE2)。苏格兰和南方能源公司实际上让它变慢了,而苏格兰和南方能源公司2号几乎没有任何区别
  • 我正在使用社区版的VisualStudio,如果这有什么不同的话

首先,对于此类操作,Eigen不太可能击败MatLab,因为后者将直接调用Intel的MKL,该MKL经过了大量优化和多线程。请注意,您还可以将Eigen配置为回退到MKL,请参阅。如果你这样做,你会得到类似的表现


尽管如此,6.4s还是远远不够。Eigen报告4k x 4k矩阵分解为0.7s。在我的计算机(Haswell laptop@2.6GHz)上运行您的示例,我得到了1.6s(铿锵7,-O3-march=native),以及启用多线程的1s(-fopenmp)。因此,请确保启用所有CPU功能(AVX、FMA)和openmp。使用OpenMP,您可能需要显式地将OpenMP线程的数量减少到物理内核的数量。

您可以共享您的matlab代码吗?当我在我的机器上运行您的代码时,使用-O3需要3.18秒。我改变了
m.lu().solve(b)
m.llt().solve(b)现在需要0.1秒。公平地说,Matlab不是默认使用双精度吗,而你的矩阵是单精度的吗?你可能想用MatrixXd替换MatrixXf,用VectorXd替换VectorXf,对吗?@Lakshay Garg如果我没弄错的话,llt()。solve()使用Cholesky分解LL'来解线性系统,这应该只有在系统矩阵“m”是正定的情况下才有效。考虑到矩阵是随机的,这似乎是无效的。您正在生成32位代码吗?若然,原因为何?64位模式的可用SIMD寄存器数量是原来的两倍,SSE2已经是基线。OP只提到启用SSE2(因此可能编译32位代码,否则SSE2是基线),这也会造成伤害,并告诉我们他们没有使用AVX或FMA。他们使用的MSVC没有任何与之相当的
-march=native
。据我所知,有了这个编译器,你必须手动启用你的CPU支持的东西,因为它只是为制作你分发的二进制文件而设计的,而不仅仅是为本地使用而设计的。(通常优化效果不如clang或gcc)。OP明确启用SSE2没有什么区别,所以我猜它已经在编译64位代码了。我读到MSVC甚至没有向您显示64位模式下SSE2的选项,您无法禁用它。他们说只通过设置SSE来禁用它会使它变慢,我认为MSVC不会让你在64位模式下这么做。因此,32位的默认设置可能已经包括SSE2。通过激活AVX、OpenMP并构建64位代码,而不是使用x86设置,所需时间从6.4s减少到1.4s,更加合理。我将尝试使用gcc,看看是否可以缩短时间。谢谢1.4s确实更好。不要错过FMA,这将为您提供额外的x1.5加速。使用MSVC,我认为您需要启用
/arch:AVX2
以获得FMA。
a = rand(5000);  b = rand(5000,1);

tic
x = a\b;
toc