유용하고 빠른 C ++ 매트릭스 라이브러리에 대한 권장 사항


158

누구나 사용할 수 있고 빠른 C ++ 매트릭스 라이브러리에 대한 권장 사항이 있습니까?

사용 가능한 의미는 다음과 같습니다.

  • 매트릭스 객체에는 직관적 인 인터페이스가 있습니다 (예 : 인덱싱하는 동안 행과 열을 사용할 수 있음)
  • LAPACK과 BLAS로 할 수있는 매트릭스 클래스로 무엇이든 할 수 있습니다
  • 배우고 사용하기 쉬운 API
  • Linux에 설치하기가 상대적으로 어려움이 없습니다 (현재 Ubuntu 11.04를 사용하고 있습니다)

나에게, 속도가 빠르거나 메모리 사용량보다 유용성이 빠르면 조기 최적화를 피할 수 있습니다. 코드를 작성할 때 항상 1D 배열 (또는 STL 벡터)과 적절한 인덱스 또는 포인터 산술을 사용하여 행렬을 에뮬레이션 할 수는 있지만 버그를 피하기를 원하지 않습니다. 또한 매트릭스를 배열로 에뮬레이트하는 데 사용 된 작은 프로그래밍 트릭을 모두 기억하기 위해 유한 관심의 일부를 사용하는 대신 문제 영역으로 해결하고 프로그래밍하려는 실제 문제에 정신적 노력을 집중하고 싶습니다. LAPACK 명령 등을 기억하십시오. 또한 작성해야하는 코드가 적을수록 표준화 될수록 좋습니다.

밀도와 스파 스는 아직 중요하지 않습니다. 내가 다루는 행렬 중 일부는 희소하지만 모든 것은 아닙니다. 그러나 특정 패키지가 밀도가 높거나 희소 행렬을 제대로 처리하는 경우 언급 할 가치가 있습니다.

표준 숫자 유형으로 작업하고 double, float 또는 int 이외의 다른 것을 저장할 필요가 없으므로 템플릿 화는 나에게 중요하지 않습니다. 멋지지만 내가하고 싶은 일에는 필요하지 않습니다.


1
CUDA를 사용하는 것이 옵션입니까?
플립 차트

1
나중에있을 수 있습니다. CUDA에 관심이 없습니다. 매트릭스 곱셈이 가장 걱정되는 응용 프로그램을위한 라이브러리를 만들고 있기 때문입니다. 대부분의 노력은 혼합 정수 선형 프로그램 솔버를 호출하는 데 소비되므로 CUDA를 사용하는 것은 과도합니다. 논문을 완성한 후에는 선형 대수가 무겁고 최적화 중심이 아닌 알고리즘을 살펴볼 계획입니다. CUDA 라이브러리에 대한 경험이 있다면 CUDA 라이브러리에 대해 게시하는 것이 좋습니다. 다른 사람들이 귀하의 생각을 알고 싶어 할 것이기 때문입니다.
Geoff Oxberry

인텔 MKL과 IPP는 어떻습니까?
Royi

답변:


146

지금까지 온라인 리서치에서 다음을 수집했습니다.

Armadillo 를 조금 사용 하고 인터페이스가 직관적이라는 것을 알았으며 Ubuntu의 바이너리 패키지를 쉽게 찾을 수있었습니다 (그리고 다른 Linux 배포판을 가정하고 있습니다). 소스에서 컴파일하지 않았지만 너무 어렵지 않을 것이라는 희망이 있습니다. 그것은 대부분의 설계 기준을 충족하며 밀도가 높은 선형 대수를 사용합니다. LAPACK 또는 MKL 루틴을 호출 할 수 있습니다. 일반적으로 Armadillo를 컴파일 할 필요는 없습니다. 순수한 템플릿 기반 라이브러리입니다. 헤더 만 포함하고 BLAS / LAPACK 또는 MKL 등에 대한 링크 만 포함하면됩니다.

나는 Eigen에 대해 좋은 것을 들었지만 그것을 사용하지 않았습니다. 그것은 빠른 주장 , 템플릿을 사용하고, 조밀 한 선형 대수를 지원합니다. LAPACK 또는 BLAS를 종속성으로 사용하지 않지만 LAPACK이 할 수있는 모든 작업 (및 LAPACK이 할 수없는 일)을 수행 할 수있는 것으로 보입니다. 많은 프로젝트가 유망한 Eigen을 사용합니다. 우분투 용 바이너리 패키지가 있지만 헤더 전용 라이브러리로는 다른 곳에서도 사용하기가 쉽지 않습니다.

매트릭스 템플릿 라이브러리의 버전 4는 유망보고, 템플릿을 사용합니다. 고밀도 및 희소 선형 대수를 모두 지원 하며 희소 솔버로 UMFPACK 을 호출 할 수 있습니다 . 웹 사이트에서 기능이 다소 명확하지 않습니다. 웹 사이트에서 다운로드 할 수있는 Ubuntu 용 바이너리 패키지가 있습니다.

Argonne National Laboratory의 팀이 작성한 PETSc 는 희박하고 밀도가 높은 선형 솔버에 액세스 할 수 있으므로 매트릭스 라이브러리로 작동 할 수 있다고 가정합니다. C로 작성되었지만 C ++ 바인딩이 있지만 C ++에서 C를 호출해도 아무런 문제가 없습니다. 문서는 엄청나게 철저합니다. 이 패키지는 내가 지금하고 싶은 일 (혼합 정수 선형 프로그램을 설정하기위한 행렬 곱셈 및 인덱싱)에 약간 과잉이지만, 나에게 또는 다른 요구가있는 다른 사람들에게 매트릭스 형식으로 유용 할 수 있습니다 나보다.

Sandia National Laboratory의 팀이 작성한 Trilinos 는 Epetra 구성 요소를 통해 밀도가 높고 희소 행렬을위한 객체 지향 C ++ 인터페이스를 제공하고 Tpetra 구성 요소를 통해 밀도가 높고 희소 행렬을위한 템플릿 인터페이스를 제공합니다. 또한 선형 솔버 및 고유 솔버 기능을 제공하는 구성 요소가 있습니다. 이 문서는 PETSc만큼 세련되거나 눈에 띄지 않는 것 같습니다. Trilinos는 PETSc의 Sandia 아날로그처럼 보입니다. PETSc는 일부 Trilinos 솔버를 호출 할 수 있습니다. Trilinos 용 바이너리는 Linux에서 사용할 수 있습니다.

Blitz 는 Linux 바이너리가있는 C ++ 객체 지향 라이브러리입니다. 메일 링리스트가 활성화되어 있지만 적극적으로 관리되지 않는 것 같습니다 (2012-06-29 : 새로운 버전이 어제 등장했습니다!). BLAS를 넘어서 수치 선형 대수의 방식으로 많은 일을하지 않는 것처럼 보이며 밀도가 높은 행렬 라이브러리처럼 보입니다. 템플릿을 사용합니다.

Boost :: uBLAS 는 C ++ 객체 지향 라이브러리이며 Boost 프로젝트의 일부입니다. 템플릿 및 조밀 한 숫자 선형 대수를 지원합니다. 빠르지 않다고 들었습니다.

템플릿 수치 Toolkit은 NIST에 의해 개발 된 C ++ 객체 지향 라이브러리입니다. 필자 Roldan Pozo는 때때로 패치를 제공하는 것으로 보이지만 더 이상 활발하게 개발되지 않는 것 같습니다 (마지막 업데이트는 2010 년). 고밀도 선형 대수에 중점을두고 일부 기본 행렬 분해 및 고유 값 솔버를위한 인터페이스를 제공합니다.

Jack Poulson이 개발 한 ElementalFLAME 과 유사한 스타일로 작성된 분산 메모리 (병렬) 고밀도 선형 대수 소프트웨어 패키지입니다 . 프로젝트의 기능 및 배경 목록은 해당 설명서를 참조하십시오 . FLAME 자체라는 순차 및 공유 메모리 밀도 선형 대수에 대한 관련 라이브러리가 libflame 객체 지향 C. Libflame에 기록 될 것으로 보인다, LAPACK처럼 많이 보이지만, 더 나은 표기법 알고리즘을 기본 빠르고 수치의 개발을 만들기 위해 선형 대수 라이브러리는 더 많은 과학과 흑인 예술이 아닙니다.

목록에 추가 할 수있는 다른 라이브러리가 있습니다. 희소 선형 대수 패키지를 "매트릭스 라이브러리"로 계산하는 경우 C에서 가장 잘 알고 있는 것은 객체 지향 스타일로 프로그래밍 된 SuiteSparse 입니다. 나는 SuiteSparse를 사용했고 꽤 쉽게 찾을 수 있다는 것을 알았습니다. 희소 문제를 작고 밀도가 높은 선형 대수 하위 문제로 분해하는 일부 알고리즘의 경우 BLAS 및 LAPACK에 의존합니다. 이 패키지의 수석 저자 인 팀 데이비스는 대단히 도움이되고 만능인입니다.

하웰 서브 루틴 라이브러리는 자신의 스파 스 선형 대수학 루틴으로 유명하며, 당신이 양식을 작성하고 다운로드 할 각 파일에 대해 전자 메일을 수신이 과정을 통과해야하지만, 학문적 사용자를위한 무료입니다. 서브 루틴에는 종종 종속성이 있으므로 하나의 솔버를 사용하려면 5-6 개의 파일을 다운로드해야 할 수 있으며 특히 양식 승인이 즉각적이지 않기 때문에 프로세스가 다소 지루해질 수 있습니다.

다른 희소 선형 대수 솔버도 있지만, 내가 알 수있는 한 MUMPS 및 기타 패키지는 대부분 선형 시스템의 솔루션에 중점을두고 있으며 선형 시스템을 해결하는 것이 가장 걱정되는 부분입니다. (나중에, 그 기능이 필요할 것이며, 다른 사람들에게 유용 할 수도 있습니다.)


2
아이겐과 엘레멘탈을 혼동 한 것 같습니다. 나는 프로젝트에 깊은 인상을 받았지만, 아이겐에서 일하지 않았습니다. Elemental은 주로 분산 메모리 시스템을 대상으로합니다.
잭 폴슨

3
첫 번째 질문은 다음과 같습니다. 병렬로 실행하고 싶습니까?
Matt Knepley

1
Trilinos에 대해 언급해야합니다 ... 여전히 가시성이 많지는 않지만 템플릿 매트릭스 패키지, 고유 솔버 및 희소 매트릭스 솔버가있는 PETSc의 실용적인 대안이며 패키지도 있습니다. 알고리즘의 부기를 추상화하기위한 것이지만, 그것이 얼마나 잘 작동하는지는 모르겠습니다.
Andrew Spott

1
Eigen은 훌륭해 보입니다. 내 동료가 전문적인 맥락에서 사용했기 때문에 성능을 저하시키지 않으면서도 신속하게 시작할 수 있습니다.
qdot

7
또한 다음 라이브러리를 귀하의 답변에 추가하겠습니다. ViennaCL -Eigen 및 MTL에 인터페이스 할 수있는 OpenCL 기반 C ++ 헤더 라이브러리. PLASMA- 타일 ​​기반 분해를 특징으로하는 BLAS 및 LAPACK 라이브러리의 UTK 기반 재 설계. MAGMA -LAPACK / BLAS 성능 향상에 중점을 둔 또 다른 UTK 프로젝트.
Aron Ahmadia

24

이 문서 는 과학 라이브러리를위한 선형 대수 라이브러리 선택을 돕기 위해 2009 년 3 월에 작성되었습니다. Eigen, GSL, Lapack ++ MTL, PETSc, Trilinos 및 uBlas 등 여러 라이브러리에 대한 이식성, 고급 인터페이스 및 라이센스를 평가합니다. 특히 FlensSeldon을 좋아하는 것 같습니다. . 요구 사항 중 하나는 C ++ 템플릿과 희소 행렬이 지원되어야한다는 것입니다.


17

위에 나열된 모든 프로젝트 중에서 PETSc와 Trilinos라는 매우 널리 사용되는 두 가지 헤비급이 있습니다. 둘 다 전문적으로 개발되었으며 대규모 개발자 기반을 가지고 있습니다. 다른 모든 것들은이 두 가지에 비해 다소 작은 프로젝트이며, 나는 (i) 앞으로 오랫동안 지원 될 것이며 (ii) 이미 필요한 모든 기능을 가지고 있기 때문에 함께 할 것을 권장합니다. 선형 대수학 (그리고 그 위에 훨씬 더).


4
PETSc는 ScaLAPACK 및 PLAPACK에 대한 약간 추상적 인 인터페이스 이상의 기능을 제공하지 않습니다. 제프 편리 조밀 한 선형 대수학에 관심이 있다면, 나는 (내가 언급을 Trilinos의 밀도 기능에 대한 충분한 모르는) PETSc 잔인한 생각
아론 Ahmadia

@ AronAhmadia :이 시점에서 답변이 커뮤니티 위키 리소스로 더 많이 변형되었다고 생각하므로 주석 작성자의 요청에 따라 패키지를 추가했습니다.
Geoff Oxberry

3
@ WalfgangBangerth : 디자인 목표를 언급하는 것이 중요하다고 생각합니다. 오래 지속되고 다른 사람들이 사용할 소프트웨어를 작성하는 것이 목표이고 선형 대수학이 해당 소프트웨어의 필수 요소라면 PETSc와 Trilinos가 좋은 선택입니다. 그러나 더 간단한 옵션이 더 간단한 API를 가지고 더 적은 코드 줄에서 거의 동일한 작업을 수행 할 수 있기 때문에 더 가벼운 옵션이 선호되고 유용한 경우가 있습니다. 마지막으로, 선택 바이어스는 코드의 생존에 중요한 역할을합니다. 더 작은 코드를 사용하지 않는 사람은 PETSc 및 Trilinos와 같은 기반을 지속하거나 구축하지 않습니다.
Geoff Oxberry

1
Geoff의 말에 덧붙이 자면, 대부분의 PETSc 및 Trilinos의 기능은 외부 라이브러리 주변의 래퍼에서 비롯됩니다. 아무도 외부 라이브러리를 직접 사용해서는 안된다고 말하는 것은 나에게 이상하게 보입니다.
잭 폴슨

1
@ JackPoulson : 나는 실제로 내 의견을 기다립니다. 예, PETSc는 많은 개별 패키지를 포장합니다. 그러나 그것은 균일 한 인터페이스로 그렇게하므로 각 패키지의 이름 지정 규칙과 스타일의 특성을 배우는 것보다 이것을 한 번 배우는 것이 더 간단합니다. 다시 말해, 각각의 개별 프로젝트가 랩핑 된 패키지를 똑같이 잘 사용할 수 있지만 PETSc를 통해 패키지를 사용할 때마다 시너지 효과가 있습니다.
Wolfgang Bangerth

11

네가 원한다면

  • 직관적 인 인터페이스를 갖춘 매트릭스 클래스
  • 모든 LAPACK 및 BLAS 기능
  • 배우고 사용하기 쉬운 API
  • 설치가 용이

그런 다음 FLENS 라이브러리를 살펴 보는 것이 좋습니다. . 나는 정확하게 이런 종류의 작업을 위해 그것을 설계했습니다. 그러나 C ++ 11 순응 컴파일러 (예 : gcc 4.7 또는 clang)가 필요합니다.

FLENS는 기본 BLAS 구현과 동일한 성능을 제공합니다. 이것을 보여주는 (오래된) 벤치 마크가 있습니다.

FLENS-LAPACK에 대해서도 같은 BLAS 구현을 사용하는 경우 Netlib의 LAPACK과 동일한 성능을 제공합니다.

새로운 벤치 마크와 관련하여 더 자세히 설명하겠습니다 ...

얼마 전에 저는 Clint Whaley (ATLAS의 저자)에게 Eigen 사이트에 게시 된 벤치 마크에 대해 어떻게 생각하는지 물었습니다. 그는이 벤치 마크가 신뢰할 수 없을 가능성이 높다고 의심했습니다. 그 동안 Clint가 제안한 방식으로 다른 실현 된 벤치 마크가있었습니다. 자세한 내용은 ATLAS 사이트 및 Eigen 메일 링리스트에서 확인할 수 있습니다. 벤치 마크는 그래프에 잘 나와 있지 않지만 ATLAS는 항상 Eigen보다 약 40 % 빠릅니다. 이는 Eigen 사이트의 벤치 마크와 모순되지만 다른 벤치 마크 (예 : blaze-lib의 벤치 마크)는 확인합니다.

밀도가 높은 선형 선형 대수의 경우 행렬 행렬 곱이 가장 관련이 있습니다. 개인적으로 나는 Eigen 또는 ATLAS가 더 빠른지 상관하지 않습니다. Eigen이 ATLAS보다 빠르면 Eigen을 BLAS 백엔드로 사용합니다.

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


안녕 마이클, scicomp에 오신 것을 환영합니다. 귀하의 URL이 작동하지 않습니다. 서버에 문제가 있습니까?
Aron Ahmadia

힌트 주셔서 감사합니다. URL은 정확하지만 파일 서버의 수학 부서에서 문제가있는 것 같습니다. 주말에만 정시에 ...
Michael Lehn

1
좋아, 난 그냥 현재의 자식의 repo에서 새로운 문서를 생성하고 다른 서버에 복사 : apfel.mathematik.uni-ulm.de/~lehn/FLENS/index.html
마이클 Lehn



1

예를 들어 유한 요소 행렬을 조립할 때, 텐서 연산 등을 수행하는 데 일반적으로 사용되는 작은 크기의 행렬을 처리하는 데 가장 적합한 행렬 라이브러리는 무엇입니까?

이미 응용 프로그램에서 발생하는 큰 스파 스 선형 시스템의 솔루션에 PETSc를 사용하고 있지만 현재이 매트릭스 / 벡터를 처리하기 위해 자체 간단한 라이브러리를 사용하고 있습니다 ... 더 빠른 라이브러리로 이동하는 것을 고려하고 있습니다 위에서 언급 한 것과 같습니다.

PETSc와 결합하기위한 최선의 선택은 무엇입니까? 아이겐? 아르마딜로? 부스트 :: uBlas? MTL4? BOOST의 일부를 사용하므로 먼저 BOOST :: uBlas 사용에 대해 생각했지만 문서, 예제 등은 많지 않습니다 ...


2
최적화 된 BLAS 루틴보다 훨씬 느린 것으로 알려져 있기 때문에 uBlas를 사용하지 않는 것이 좋습니다. 나는 영리한 템플릿 트릭으로 인해 매우 작은 행렬에 대해 Eigen이 가장 빛을 발한다고 생각합니다.
잭 폴슨

1
이것은 아마도 별도의 질문에 더 좋습니다. 나는 Eigen, MTL4 및 Armadillo가 모두 소형 시스템을 해결하기위한 트릭을 가지고 있음을 알고 있지만 매트릭스를 조립하는 방법을 요구하고 있다고 생각합니다. 나는 일반적으로 요소별로 행렬을 조립합니다. 언급 된 라이브러리 중 어느 것이 PETSc와 연결하기에 적합한 지 잘 모르겠습니다. 아직 PETSc 사용자가 아닙니다. 부스트 :: uBlas에 대한 Jack의 의견은 두 번째입니다. 느리기 때문입니다.
Geoff Oxberry


0

지금까지 아무도 TooN에 대해 언급 하지 않았습니다. 거의 3 년 동안 행복하게 사용하고 있습니다.

포괄적이지는 않지만 Eigen 과 매우 유사합니다 . 그러나 나는 그것이 어떤면에서 더 좋은 구문을 가지고 있다고 생각합니다.

또한 Lie Groups (2 차원 및 3 차원의 특수 유클리드 / 직교 등) 및 관련 Lie Algebra를 기반으로 그래픽 및 비전에서 자주 발생하는 일반적인 변환을 모델링하는 데 도움이되는 클래스가 제공됩니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.