누구나 Eigen sparse 행렬의 다음 동작을 설명 할 수 있습니까? aliasing과 lazy evaluation을 조사했지만이 문제를 개선 할 수없는 것 같습니다. 기술 사양 : g ++ 컴파일러와 최적화 플래그가없는 우분투 16.10에 최신 Eigen 안정 버전을 사용하고 있습니다.Eigen C++ : 희소 행렬 조작의 성능
가정한다 I는 다음과 같이 간단한 신원을 정의
SparseMatrix<double> spIdent(N,N);
spIdent.reserve(N);
spIdent.setIdentity();
다음 세위한 계산 시간을 그
spIdent-spIdent;
spIdent*spIdent;
spIdent - spIdent*spIdent;
이러한 작업을 수행하고 측정한다. 내가 얻을 것은 두 작업이 빠르지 만 조합이 매우 낮다는 의미이
0 Computation time: 2.6e-05
1 Computation time: 2e-06
2 Computation time: 1.10706
입니다. noalias()
메서드는 조밀도 행렬에 대해서만 정의되었으며, 플러스 예제에서는 그다지 차이가 없습니다. 어떤 깨달음?
MCVE :
#include <iostream>
#include <ctime>
#include "../Eigen/Sparse"
using namespace std;
using namespace Eigen;
int main() {
unsigned int N=2000000;
SparseMatrix<double> spIdent(N,N);
spIdent.reserve(N);
spIdent.setIdentity();
clock_t start=clock();
spIdent*spIdent;
cout << "0 Computation time: " << float(clock() - start)/1e6 << '\n';
start=clock();
spIdent-spIdent;
cout << "1 Computation time: " << float(clock() - start)/1e6 << '\n';
start=clock();
spIdent - (spIdent*spIdent);
cout << "2 Computation time: " << float(clock() - start)/1e6 << '\n';
return 0;
}
어, 최적화 플래그를 사용 하시겠습니까? –
문제는 정확하게 더 빨리 만드는 것이 아닙니다 ... 그러나 세 번째 사례가 왜 그렇게 느린 지 이해하십시오! – Tim
첫 번째 두 개는 코드가 전혀없는 상태로 최적화되어 있습니다. 세 번째는 그렇지 않았습니다. – Yakk