경량 / 비 설치 C 또는 C ++ 기반 고밀도 선형 대수 솔버에 대한 권장 사항


9

내 프로그래밍의 대부분은 내가 사용하는 C의 일회용 연구 코드입니다. 가까운 공동 작업자 이외의 다른 코드를 배포 한 적이 없습니다. 과학 저널에 게시하는 알고리즘을 개발했습니다. 기사의 온라인 보충 자료에 소스 코드와 실행 코드를 제공하고 싶습니다. 동료가 알고리즘을 일반화하여 C ++ (ack!)로 작성해야하고 작은 조밀 한 선형 시스템을 풀어야한다고 요구했습니다. 알고리즘에 대한 사용자 기반을 얻는 데 성공하면 부분적으로 알고리즘을 사용하기위한 입력 막대가 낮기 때문에 부분적으로 발생합니다. 잠재적 사용자는 코드를 사용하기 위해 라이브러리 등을 설치하지 않습니다. 코드가 완전히 독립적이며 라이센스로 인해 방해받지 않기를 바랍니다. Golub과 van Loan에서 무언가를 가져 와서 내 자신의 솔버를 작성하는 것이 좋을지 모르지만 다른 누군가가 이미 작성한 바닐라 솔버를 사용하고 싶습니다. 제안에 감사드립니다. 감사!



친애하는 jep, 포럼에 오신 것을 환영합니다. 귀하의 질문은 다음 질문과 매우 유사합니다 : scicomp.stackexchange.com/questions/351/…
GertVdE

라이브러리 솔버는 견고성, 효율성 및 일반성을 위해 복잡하고 큰 경향이 있습니다. 당신의 문제가 매우 작고 합리적으로 잘 조절된다면, 당신은 당신 자신의 미니 구현을 작성하도록 제안 할 것입니다.
Stefano M

@GertVdE,이 질문에 대한 빠른 응답에 감사드립니다. "권장 사항 ..."질문에 연결하는 것이 불편합니다. 질문과 대답이 너무 일반적이기 때문에 이러한 상황에서 도움을 줄 수 없기 때문입니다. 더 자세히 논의하고 싶다면 scicomp 대화방으로 가져 가십시오 .
Aron Ahmadia

@AronAhmadia : 이러한 논쟁 중 일부를 해결하는 유일한 방법은 언어와 라이브러리에 따라 계산 과학 프로그래밍 chrestomathy를 구현하는 것입니다. 코드가 명확하고 구성 문제를 처리 할 수있는 경우 (쉘 스크립트, Chef 또는 Puppet 사용), 코드를 실행하고 타이밍을 지정하여 성능에 대한 논쟁을 처리 할 수 ​​있습니다. 참조 기계. 명확성에 대한 토론은 코드를 보면 해결할 수 있습니다 (적어도 더 구체적으로 만들 수 있습니다). 그렇지 않으면, 우리는 계속 같은 주장을하게 될 것입니다.
제프 옥스 베리

답변:


7

Lapack 인터페이스를 필요한 기능에 정확하게 복제하는 것이 좋습니다. dgesv . 입니다. 그렇게하면 Lapack을 설치 한 사람들이 간단히 링크 할 수 있으며 작동합니다. Lapack을 설치하지 않은 사용자의 경우이 기능을 직접 구현하거나 다른 사람들이 제안한대로 Eigen 또는 FLENS를 사용하여 구현할 수 있습니다.

Fortran 토지에서 Lapack 라이브러리는 이러한 표준으로, 대부분의 사람들은 자체 구현을 제공하는 대신 단순히 표준을 사용합니다.


+1 대부분의 Linux 배포판 (적어도 데비안 기반)은 저장소에 바이너리 패키지가 있으며 모든 공급 업체가 제공 한 수학 라이브러리 (MKL, SunPerf, ACML, ESSL 등)가이를 가지고 있다는 사실을 덧붙입니다. Windows / Mac을 사용하는 경우 무료 Fortran 컴파일러 (gfortran)를 설치하는 것이 약간의 작업이므로 C를 사용하는 것이 더 좋을 수도 있지만 항상 표준 라이브러리를 최대한 많이 사용해야합니다.
stali

lapack을 여러 번 사용했지만 현재 포트란 땅에 없습니다. 사용자 기반이 실행되는 플랫폼의 통계적 분포는 주로 윈도우, 더 적은 비율의 Mac 및 훨씬 더 적은 비율의 * nix에서 세계와 유사 할 것으로 예상합니다. 창문에 대한 나의 경험은 최소한이며 그렇게 유지하는 것을 선호합니다. 이것이 독립형 C ++ 코드를 원하는 이유입니다. 코드를 컴파일하고 실행하는 데 도움이되는 내 사용자 중 일부를 제공해야한다고 생각합니다. 이를 위해 필요한 작업을 최소화해야합니다.
jep

사용자 기반이 Windows / Mac 인 경우 간단한 C 기반 (아마도 자신의) 구현을 사용하는 것이 좋습니다. 설치가 어렵거나 5 개의 다른 라이브러리에 의존하는 패키지, 특히 데비안과 같은 일류 바이너리 패키지 저장소가없는 경우, 오랫동안 사용자를 끌 수 있습니다. 대부분의 Windows / Mac 사용자는 원 클릭 설치에 익숙합니다. 사용의 용이성은 다른 모든 것을 이깁니다.
stali

5

과학 컴퓨팅을 시작할 때 많은 사람들이하는 초기 실수는 모든 코드를 동일한 언어로 작성해야한다는 가정입니다. 컴파일 된 프로그램이 동일한 컴파일러 버전에서도 서로 통신하는 방법이 명확하지 않은 역사적인 이유 때문이라고 생각합니다. 즉,이 경우 어쨌든 C ++를 사용하려는 경우 요구에 맞는 몇 가지 매우 좋은 C ++ 헤더 전용 템플릿 라이브러리가 있습니다.

학업상의 이유로 코드를 배포하고 있으며 코드에 밀도가 높은 선형 대수 솔버를 포함 시키려면 Eigen 을 고려하는 것이 좋습니다 . Eigen은 Mozilla Public License에 따라 라이센스가 부여되었으며 헤더 전용 라이브러리입니다. 즉, 소스 형식으로 코드와 함께 Eigen을 배포 할 수 있으며 (코드에 라이센스 제한이 적용되지 않음) 매우 효율적인 고밀도 선형 솔버를 포함한 일반적인 기능에 액세스 할 수 있습니다. GertVdE가 언급했듯이 몇 가지 다른 옵션이 있습니다 .


하나의 파일을 원했습니다. 나는 꽤 오랫동안 과학 프로그래밍을 해왔다. 나는 C와 포트란과 같은 언어를 꽤 많이 혼합했지만이 프로젝트에서는 모든 소스 코드가 들어있는 하나의 파일 만 원합니다. 나는 C ++ 코드에 C 솔버를 넣을 수 있다고 생각합니다. 주로 코드를 가능한 한 단순하게 유지하고 싶습니다. 회전하는 LU가 적절해야합니다. 아이겐을 보겠습니다. 감사!
jep

@jep, 성능에 전혀 신경 쓰지 않는다면 CLAPACK 에서 필요한 루틴을 체리 피킹 할 수도 있습니다 .
Aron Ahmadia 1

모든 종속 코드를 동일한 언어로 작성해야하는 이유가 있습니다. 특히 HPC 환경에서는 이상한 컴파일러 / 링크 문제와 32/64 비트 인터페이스 문제가 있습니다. 예를 들어 내장 라이브러리의 정수 너비를 어떻게 알 수 있습니까? 내장 라이브러리에 어떤 컴파일러가 사용되었는지 어떻게 알 수 있습니까?이 컴파일러를 다른 컴파일러와 연결할 수 있습니까? 모든 언어를 한 언어로 사용하면 이러한 여러 문제를 단순화 할 수 있습니다. 그리고 그렇습니다. 클러스터 관리자가 제공하는 문서가 있어야하지만 대부분은 그렇지 않습니다.
Victor Liu

@VictorLiu-당신이 말하는 문제는 언어보다 구현에 더 밀접하게 연결되어 있습니다. 댓글 공간은 진지한 토론을하기에 열악한 곳이지만, 이에 대한 생각을 넓히고 싶다면 채팅이나 다른 곳에서 만나게되어 기쁩니다.
Aron Ahmadia

4

선형 방정식 시스템을위한 신뢰할 수있는 솔버를 원한다면 FLENS를 추천 합니다 . LAPACK을 정확하게 다시 구현합니다 (단일 스레드 BLAS 구현을 사용하는 경우 LAPACK과 동일한 반올림 오류도 재현 함). 이는 모든 FLENS-LAPACK 기능 (유틸리티 기능과 함께 약 100 개의 루틴)에 적용됩니다.

FLENS는 BSD 라이센스에 따라 독점 제품에 통합 될 수 있습니다.

FLENS는 헤더 전용이며 FLENS의 하위 집합 만 필요한 경우 필요한 기능 만 포함 된 제거 된 버전을 제공 할 수 있습니다. FLENS에는 자체 참조 BLAS 구현이 제공됩니다. 그러나 선택적으로 사용자는 ATLAS, OpenBLAS 또는 GotoBALS와 같은 최적화 된 BLAS 라이브러리에 연결할 수 있습니다. 큰 행렬의 경우 이것은 Eigen에 비해 약 40 %의 성능 향상을 제공합니다.

그리고 예, Eigen은 LAPACK 테스트 스위트를 사용하여 결과를 확인합니다. 3 가지 기능 (대칭 행렬의 Lu, Cholesky 및 고유 값 / 벡터)에 대해이 작업을 수행합니다. 그러나 비대칭 행렬의 고유 값 / 벡터를 계산하면 LAPACK 테스트 스위트가 실패합니다.

면책 조항 : 예, FLENS는 내 아기입니다! 그것은 내가 약 95 %를 코딩했으며 모든 코드 줄이 그만한 가치가 있음을 의미합니다.



물론, 당신은 또한 '예를 들어 아이겐 (Eigen)'과 같은 것으로 '아이겐 (Eigen)을 고려하는 것이 좋습니다. 이 경우 나는 이것을 포함하여 Eigen에 대한 내 의견을 삭제합니다 (모두 사실임이 입증되었지만).
Michael Lehn

1
Eigen에 대한 귀하의 의견은 여기서 문제가되지 않습니다 (비제 시적 인 주제는 아니지만). 귀하는 FLENS의 주요 개발자이며, 여기에 답변으로 추천하려면 프로젝트 개발자로서 귀하의 소속을 공개해야합니다.
Aron Ahmadia

아, 그럼 나는 '... 줄 수 있습니다 ...'에 의해 암묵적으로 명확하다고 생각했습니다. 이 형식으로 공개해도 괜찮습니까?
Michael Lehn

2
이 작업을 수행해 주셔서 감사합니다. C ++에서 Lapack의 많은 부분을 다시 구현하려는 비슷한 계획이있었습니다. 그러나 대부분의 고급 (고유 값) 루틴의 경우 Lapack 호출을 연기하기 때문에 전체를 다시 구현한다고 말하는 것은 약간의 잘못된 광고입니다. 반면, 실제로 ZGEEV 소스를 RNP의 C ++로 이식 했지만 일부 부분은 여전히 ​​자동 변환에서 1 기반 인덱싱에 있습니다.
Victor Liu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.