문제

C ++에서 쌍곡선 부분 미분 방정식을위한 소프트웨어를 작성하고 있습니다. 거의 모든 표기법은 벡터와 매트릭스입니다. 또한 선형 대수 솔버가 필요합니다. 그렇습니다. 벡터와 매트릭스 크기는 상당히 다를 수 있습니다 (예 : 분산 메모리 컴퓨팅, 예를 들어 클러스터 또는 유사한 아키텍처로만 해결할 수있는 1000에서 크기까지). 유토피아에 살았다면 클러스터, GPU 및 멀티 코어에 적합한 선형 솔버가있었습니다.

변수를 나타내는 데이터 구조에 대해 생각할 때, 나는 boost.ublas와 mtl4를 Accros에 올랐습니다. 두 라이브러리는 BLAS 레벨 3 호환성이며 MTL4는 스파 스 솔버를 구현하며 UBLA보다 훨씬 빠릅니다. 둘 다 멀티 코어 프로세서에 대한 지원을 구현하지 않았으며 분산 메모리 계산에 대한 병렬화는 말할 것도 없습니다. 다른 한편으로, MTL4의 개발은 2 명의 개발자의 단독 노력에 달려 있으며 (적어도 내가 이해했던대로), UBLA가 부스트 라이브러리에있는 이유가 있다고 확신합니다. 또한 인텔의 MKL 라이브러리에는 UBLA와 구조를 바인딩하기위한 예제가 포함되어 있습니다. 내 데이터와 소프트웨어를 오랫동안 견고하고 개발 및 유지 관리 할 데이터 구조에 바인딩하고 싶습니다.

마지막으로, 질문. UBLA 및/또는 MTL4 사용 경험은 무엇이며 무엇을 추천 하시겠습니까?

고맙습니다, Mightydodol

도움이 되었습니까?

해결책

당신의 요구 사항으로, 나는 아마 갈 것입니다 부스트 :: ublas. 실제로, UBLA의 우수한 배치는 속도와 관련하여 MTL4와 비슷해야합니다.

그 이유는 존재하기 때문입니다 바인딩 ~을 위한 아틀라스 (따라서 컴퓨터에 효율적으로 최적화 할 수있는 공유 메모리 병렬화) 및와 같은 공급 업체 조정 구현도 인텔 수학 커널 라이브러리 또는 HP MLIB.

이러한 바인딩을 사용하면 수학을 수행하는 잘 조정 된 아틀라스 / BLAS 라이브러리가있는 UBLA는 충분히 빠르야합니다. 주어진 BLA / ATLAS에 연결하면 컴파일러 플래그를 사용하여 동일한 BLA / ATLA에 연결된 MTL4와 비슷해야합니다. -DMTL_HAS_BLAS, 그리고 자신의 것에 따라 BLA가없는 MTL4보다 더 빠릅니다. 관찰 (예제 참조 여기, 어디 고토 블라스 MTL4보다 성능이 우수합니다).

요약하면, BLAS 라이브러리를 기꺼이 사용하는 한 속도가 결정적인 요소가되어서는 안됩니다. 유용성과 지원이 더 중요합니다. MTL 또는 UBLA가 더 적합한 지 결정해야합니다. 나는 그것이 부스트의 일부라는 점을 감안할 때 ublas를 향한 경향이 있으며 MTL4는 현재 BLA 만 지원합니다. 선택적으로. 당신은 또한 이것을 약간 날짜로 찾을 수 있습니다 과학적 C ++ 패키지의 비교 흥미로운.

하나의 큰 소리 : 당신의 요구 사항 (매우 큰 행렬)의 경우 "구문 설탕"UBLA 또는 MTL을 건너 뛰고 BLAS / LAPACK의 "Metal"C 인터페이스를 직접 호출 할 것입니다. 그러나 그것은 단지 나입니다 ... 또 다른 장점은 전환하는 것보다 쉬워야한다는 것입니다. Scalapack 더 큰 문제를 위해 (분산 메모리 라크, 그것을 사용한 적이 없음). 분명히 : 집에있는 문제의 경우 BLAS 라이브러리를 직접 전화하는 것이 좋습니다.

다른 팁

C ++에서 벡터, 행렬 및 선형 대수를 프로그래밍하는 경우 Eigen을 볼 것입니다.

http://eigen.tuxfamily.org/

UBLA (MTL4에 대해서는 확실하지 않음)와 훨씬 더 깨끗한 구문보다 빠릅니다.

새로운 프로젝트의 경우 Boost의 Ublas에서 멀리 떨어져있는 것이 가장 좋습니다. UBLAS FAQ는 2012 년 말 부터이 경고를 받았습니다.

Q : 새로운 프로젝트에 UBLA를 사용해야합니까? ... UBLA의 마지막 주요 개선은 2008 년이었고 2009 년 이후 큰 변화는 없었습니다. ... 성능? 더 빠른 대안이 있습니다. 최첨단? UBLA는 10 세 이상이며 C ++ 11의 모든 새로운 것을 놓쳤습니다.

이 목록에는 하나의 C ++ 라이브러리가 누락되어 있습니다 : Flens

http://flens.sf.net

면책 조항 : 네, 이것은 내 아기입니다

  • 헤더 전용입니다
  • BLA의 단순하고 비 성능, 일반 (예 : 템플릿) C ++ 참조 구현이 함께 제공됩니다.
  • 사용 가능한 경우 최적화 된 BLA 구현을 백엔드로 사용할 수 있습니다. 이 경우 BLAS를 직접 사용하는 것과 같습니다 (일부 벤치 마크를 업데이트해야합니다).
  • 당신이 사용할 수있는 BLAS 기능을 호출하는 대신 오버로드 된 연산자.
  • 그것은 많은 라크 함수의 고유 한 독립형 일반적인 재 구현과 함께 제공됩니다. 우리는이 항구라고 부릅니다 Flens-Lapack.
  • Flens-Lapack은 Netlib의 LaPack과 정확히 동일한 정확도와 성능을 가지고 있습니다. 그리고 내 경험상 (Flens-) Lapack+Atlas 또는 (Flens-) Lapack+OpenBlas는 ACML 또는 MKL과 동일한 성능을 제공합니다.
  • Flens는 선형 대수 표현식 평가에서 임시 벡터/매트릭스 생성에 관한 다른 정책을 가지고 있습니다. Flens 정책은 다음과 같습니다. 절대 만들지 마십시오 !!!. 그러나 a 특별 디버그 모드 우리는 "필요한 경우"임시를 창출 할 수 있습니다. 이 "필요한 경우"정책은 Eigen 또는 Armadillo와 같은 다른 라이브러리 또는 Matlab의 기본값입니다.

성능 차이를 여기에서 직접 볼 수 있습니다.http://www.osl.iu.edu/research/mtl/mtl4/doc/performance.php3

둘 다 인터페이스 측면에서 사용할 합리적인 라이브러리입니다. UBLA가 Boost 검토 프로세스를 통해 반드시 더 강력하다고 생각하지는 않습니다. 나는 UBLAS 구현의 불분명 한 부작용과 의도하지 않은 결과를 가진 악몽을 가졌습니다.

그것은 Ublas가 나쁘다는 말은 아니지만 정말 좋습니다. 그러나 요즘 MTL의 극적인 성능 차이를 감안할 때 Ublas 대신에 사용하는 것이 가치가 있다고 생각합니다. .

하루가 끝나면 매트릭스 라이브러리가있는 속도에 관한 것입니다. MTL4로 이동하십시오.

내 경험에서 MTL4는 UBLA보다 훨씬 빠르며 고유보다 빠릅니다.

MTL4의 병렬 버전이 있습니다. 그냥 살펴보십시오 시부 노바

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top