요구 사항을 분석해 보겠습니다.
- 유지 보수성
- 텍스트 데이터 읽기 / 쓰기
- LU 분해를위한 강력한 인터페이스 / 기능
- 희소 선형 솔버
- 대용량 데이터에 대한 성능 및 확장 성
이 목록에서 다음 언어를 고려할 것입니다.
C, C ++, 포트란, 파이썬, MATLAB, 자바
Julia는 유망한 새로운 언어이지만 커뮤니티는 여전히 그 주위를 형성하고 있으며 주요 코드로 배포되지 않았습니다.
텍스트 데이터 읽기 / 쓰기
이것은 모든 프로그래밍 언어로 쉽게 얻을 수 있습니다. I / O 액세스를 적절하게 버퍼링하고 통합해야하며 고려해야하는 모든 언어에서 우수한 성능을 얻을 수 있습니다. 성능이 좋은 사용법을 모르면 C ++에서 스트림 오브젝트를 피하십시오.
LU 분해를위한 강력한 인터페이스 / 기능
밀집된 LU 분해를 수행하는 경우 병렬 기능에 LAPACK 또는 ScaLAPACK / Elemental을 사용하려고합니다. LAPACK과 ScaLAPACK은 Fortran으로 작성되었으며 Elemental은 C ++로 작성되었습니다. 세 라이브러리는 모두 성능이 우수하고 잘 지원되며 문서화되어 있습니다. 고려해야 할 언어 중 하나에서 인터페이스로 인터페이스 할 수 있습니다.
희소 선형 솔버
무료로 제공되는 스파 스 선형 솔버는 거의 모두 C로 작성된 PETSc를 통해 사용할 수 있으며 잘 문서화되고 지원됩니다. 고려해야 할 모든 언어에서 PETSc에 인터페이스 할 수 있습니다.
대용량 데이터에 대한 성능 및 확장 성
언급 한 유일한 병렬 프로그래밍 패러다임은 공유 메모리 기반이므로 MPI 기반 (메시지 전달) 분산 메모리 컴퓨팅 방식을 고려하지 않습니다. 필자의 경험에 따르면 분산 메모리 솔루션을 사용하면 수십 개의 코어 이상으로 확장되는 코드를 작성하는 것이 훨씬 쉽습니다. 오늘날 거의 모든 대학 "클러스터"는 MPI 기반이며, 대형 공유 메모리 머신은 비싸고 그에 따라 드물다. 접근 방식에 MPI를 고려해야하지만 선택한 프로그래밍 패러다임에 관계없이 조언이 적용됩니다.
온 노드 성능과 관련하여 수치 루틴을 직접 작성하는 경우 Fortran에서 우수한 직렬 성능을 얻는 것이 가장 쉽습니다. C, C ++ 또는 Python에 대해 약간의 경험이 있다면 비교할만한 성능을 얻을 수 있습니다 (C와 C ++는 Fortran에서 치명적입니다. Python과 MATLAB은 많은 노력없이 약 25 %의 시간 오버 헤드 내에 있습니다). MATLAB은 JIT 컴파일러와 매우 우수한 선형 대수 표현성을 통해이를 수행합니다. Cython, numpy, numexpr을 사용하거나 숫자 커널을 포함하여 Python에서 성능을 주장해야 할 것입니다. 나는 언어를 잘 모르기 때문에 Java의 성능에 대해서는 언급 할 수 없지만 전문가가 작성한 경우 파이썬과 멀지 않은 것으로 생각됩니다.
인터페이스에 대한 참고 사항
나는 당신이 당신이 고려하고있는 어떤 프로그래밍 언어로든 원하는 모든 것을 할 수있을 것이라고 확신했으면한다. Java를 사용하는 경우 C 인터페이스는 약간 까다로울 수 있습니다. Python은 ctypes, Cython 및 f2py를 통해 탁월한 C 및 Fortran 인터페이스를 지원합니다. LAPACK은 이미 포장되어 있으며 scipy를 통해 제공됩니다. MATLAB은 기본 라이브러리에 필요한 모든 기능을 갖추고 있지만 클러스터에서 쉽게 확장 가능하거나 실행하기가 쉽지 않습니다. Java는 JNI 와 C 및 Fortran 인터페이스를 지원할 수 있지만 과학 컴퓨팅을위한 클러스터 및 병렬 소프트웨어에서는 일반적으로 발견되지 않습니다.
유지 보수성
이 중 많은 부분이 개인적인 취향에 달려 있지만 유지 관리에 대한 일반적인 합의는 소프트웨어의 코드 줄 수를 최소화하고, 잘 정의 된 인터페이스로 모듈 식 코드를 작성하고, 계산 소프트웨어를 제공하려는 것입니다. 구현의 정확성과 기능성을 검증하는 테스트
추천
나는 개인적으로 파이썬으로 많은 행운을 얻었 으며 많은 계산 프로젝트에 권장합니다. 나는 당신이 당신의 프로젝트를 위해 그것을 강력하게 고려해야한다고 생각합니다. 파이썬과 MATLAB은 아마도 과학 컴퓨팅에 사용할 수있는 가장 표현적인 언어 일 것입니다. Python을 다른 프로그래밍 언어에 쉽게 인터페이스 할 수 있습니다. f2py를 사용하여 현재 Fortran 구현을 래핑하고 Python에서 원하는 부분을 하나씩 다시 작성하여 기능을 유지하고 있는지 확인할 수 있습니다. 현재 공식 Python 2.7 구현 과 scipy 조합을 권장합니다 . 무료로 제공되는 Enthought Python Distribution 에서이 스택을 쉽게 시작할 수 있습니다 .
C, C ++ 또는 Fortran에서 대부분의 작업을 수행 할 수도 있습니다. C 및 C ++는 많은 경험을 가진 전문 개발자에게는 매우 매력적인 언어이지만, 종종 새로운 개발자를 트립하고 이러한 의미에서보다 학문적 인 코드에 대한 좋은 아이디어는 아닙니다. Fortran과 MATLAB은 학술 계산에서 널리 사용되지만 고급 데이터 구조 및 Python이 제공하는 표현력에는 약합니다 (예 : Python dict 객체 생각).
관련 질문 :