우리는 우리의 C++ 코드를 최적화하기 위해 노력하고있는 우리가 다음의 행렬 계산 (고유치 라이브러리를 사용하는) 그들은 모두 NXN 행렬이며, I는 단위 행렬이다C++ 행렬 계산 효율
#include<Eigen/Dense>
int main(){
MatrixXd P = MatrixXd::Random(30,30); // a random double 30 x 30 matrix P
MatrixXd M = MatrixXd::Random(30,30); // a random double 30 x 30 matrix M
Matrix<double, 30, 30> I;
I.setIdentity(); // I is an 30 x 30 identity matirx
P = (I-M)*P
return 0;
}
. 우리는 ~ 4-8x에
P = P-M*P
결과로서 상기 매트릭스 연산
P= (I- M)*P
재기록이 GCC 6.2 컴파일러를 사용하는 리눅스 우분투 시스템에 빠르게 찾아 냈다. 필자는 컴파일러가 항등 매트릭스와 사실 I * P = P에 대해 아무 것도 모를 수도 있지만 여전히 효율성이 훨씬 향상되는 것에 대해 내 머리를 감쌀 수는 없다는 것을 깨닫습니다. 누구나 그러한 실질적인 개선을 가져올 수있는 가능한 이유를 알고 있습니까?
내가 전문가는 아니지만,하지만 P를 사용하여, M은 더 나은 캐시 행동처럼 들린다 I, M, P를 사용하는 것보다. 안타깝게도 이러한 종류의 최적화는 매우 복잡하고 (일부 대상 아키텍처에서) 매트릭스의 실제 크기 (및 내부 유형)가 여기에서도 중요하다고 가정합니다! – sascha
두 번째 버전은 아마도 'dgemm' http://www.netlib.org/lapack/lapack-3.1.1/html/dgemm.f.html과 같이 일시적인 시간이없는 단일 함수 호출과 일치하며 첫 번째 버전은 그렇지 않습니다. 단일 함수와 일치하므로 임시 연산을 사용하여 계산합니다 (먼저 'I - M'을 계산 한 다음 'P'를 곱하고 'P'의 이전 값을 대체합니다.) – alfC
[mcve]를 제공하십시오. . 플랫폼 및 게시 방법을 게시하십시오. 해체 게시 또한 도움이 될 것입니다. – xaxxon