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 의 소스 코드 는 간단합니다.

동일한 행렬로 여러 번 풀면 dgttrf 및 dgttrs 를 사용하여 요인을 저장할 수 있습니다 . 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.