LAPACK은 3 각형 시스템을 어떻게 해결합니까?


9

내 프로젝트에서 매 단계마다 두 개의 삼각 행렬을 풀어야하므로 좋은 솔버를 갖는 것이 중요합니다. 나는 Wikipedia에 설명 된 고전적인 방법 인 내 자신의 구현을했습니다. 그런 다음 Lapack을 대신 사용해 보았습니다. 놀랍게도 느려졌습니다!

이제 Lapack 내부에서는 LU 인수 분해로 해결하는 것처럼 보이며 왜 그렇게 복잡하지 않은지 궁금합니다.

또한 nr.com의 "Numerical Recipes"책에서 시스템을 작은 3 각형 문제로 재귀 적으로 나누는 알고리즘을 발견했습니다. 유망 해 보였다. 다른 좋은 점이 있습니까?

업데이트 : 문제 크기는 약 1000x1000입니다. GotoBLAS를 사용했는데 Lapack 3.1.1 라이브러리도 제공합니다. 문제는 대칭이 아닙니다. 나는 일반적인 tridiagonal 행렬에 Lapack 루틴을 사용했습니다.


2
이 작업에 사용한 LAPACK 루틴을 명시해야합니다. 참고 것을 dgtsv의 수행 부분 회전하지만 코드는이 작업을 수행 할 수 없습니다. 테스트 한 LAPACK 구현과 벤치마킹 한 문제 크기도 설명하십시오. 또한 문제의 대칭 양수가 확실합니까?
Jed Brown

질문 형식화에 정보를 추가했습니다.
tiam

응용 프로그램이 유한 체적 방법과 관련이 있습니까?
Inquest

그것은 유한 한 차이이지만,이 관점에서 그것은 내가 생각하는 것과 거의 동일합니다.
tiam

답변:


6

부분 피벗을 수행하는 참조 구현을 사용하고 있습니다. Tridiagonal solve는 거의 작동하지 않으며 BLAS를 호출하지 않습니다. 부분 피벗을 수행하기 때문에 코드보다 느릴 수 있습니다. dgtsv소스 코드 는 간단합니다.

동일한 행렬로 여러 번 풀면 dgttrfdgttrs 를 사용하여 요인을 저장할 수 있습니다 . MKL, ACML 또는 ESSL과 같은 최적화 된 LAPACK의 구현이 더 성능이 우수 할 수 있습니다.


조금 궁금합니다. PP가있는 Gaussian Elim은 TriDiagonal을 포함한 모든 행렬에서 작동합니다. CFD에서는 TDMA 라는 FVM 1D 사례에 특별한 방법을 사용합니다 . 그가 논의하고있는 경우에 어느 쪽이 더 빠를 것이라고 생각하십니까? 비록 그의 행렬이 대각선으로 지배적이라고 확신 할 수는 없습니다.
Inquest

TDMA는 코드에서 구현 한 것입니다. 문제는 초고속 Lapack이 특정 매트릭스에서 부분 피벗 팅 절차를 사용하는 이유인데, 이는 TDMA와 같은 쉬운 방법으로 더 빨리 해결됩니다.
tiam

정확히 동일한 알고리즘 (삼각형 행렬에 특화된 가우스 제거)이지만 구현시 부분 피벗을 수행하지 않으므로 수치 적으로 불안정 할 수 있습니다. 그 선회는 자유롭지 않으며 귀하는 참조 구현과 비교하고 있습니다. 참조 구현은 성능에 최적화되지 않았으며 부분 피벗은 자유롭지 않습니다.
Jed Brown

나는 당신이 무엇을 의미하는지, 내가 해결하고있는 시스템에 대한 나의 지식으로부터 이점을 얻는다. LAPACK의 다른 구현은 특정 아키텍처에 대한 적응으로 인해 성능 향상을 제공합니까?
tiam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.