2016-09-25 6 views
0

고정 된 크기의 대각선을 따르는 블록을 제외하고는 드문 드문 행렬을 가지고 있다고 가정 해 보겠습니다.Eigen을 이용한 효율적인 블록 - 희소 행렬 곱셈

Eigen::SparseMatrix<float> lhs;

좌 약 2 % 비 희소이지만, 매우 클 수있다. 그럼, 내가 벡터가 있다고 가정 해 보자 순간

Eigen::MatrixXf rhs = Eigen::MatrixXf::Random(SomeSz, 1);

,의 그것 밀도의 가정하자.

I 효율적으로 계산 할

:

result.noalias() = lhs * rhs;

내가 (연타와) -03 -march = 기본 -mtune = 네이티브 컴파일 할 수 있었다면,이 최적의 결과를 얻을 것인가? 우 스파 스 무슨 경우에도

:

Eigen::SparseMatrix<float> rhs; rhs.resize(SomeSz, 1); rhs.reserve(SomeSz/SomeFactor);

은 다음과 같습니다

result = lhs * rhs;

여전히 최적/차선?

내가 원하는 것은 Eigen이 블록 스파 스 구조를 이용하고 필요한 계산 만 수행하는지 여부입니다.

답변

0

우선 rhs의 밀도가 높은 경우 rhs가 벡터 인 경우 VectorXf을 사용하여 Eigen에게 알려주십시오. 그런 다음 Eigen 3.3을 사용하면 -fopenmp으로 컴파일하고 lhs의 행 - 주요 저장 장치를 사용하여 멀티 스레딩을 이용할 수 있습니다.

희소 한 경우 예 Eigen은 lhs와 rhs의 희소성을 고려합니다. 복잡성은 실제로는 rhs.nonZeros()*average_nnz_per_col_of_lhs이고 밀도가 높은 rhs는 rhs.size()*average_nnz_per_col_of_lhs입니다. 그래서 rhs가 정말로 희소하다면, 시도해 볼만한 가치가있을 것입니다. lhs의 유용한 열만 고려됩니다. 이 경우 lhs column-major를 잘 유지하십시오.