답변:
종종, 선택은 (1) 해결하려는 문제, (2) 가지고있는 기술 및 (3) 함께 일하는 사람들 (단독 프로젝트가 아닌 경우)에 달려 있습니다. 나는 모든 사람의 개인적인 상황에 달려 있기 때문에 잠시 동안 (3) 남겨 둘 것입니다.
문제 의존성 : 포트란은 어레이 처리에 탁월합니다. 간단한 데이터 구조 및 특정 배열로 문제를 설명 할 수 있으면 Fortran이 적합합니다. 포트란 프로그래머들은 명백하지 않은 경우에도 (예를 들어 그래프를 표현하기 위해) 배열을 사용하게됩니다. C ++는 복잡하고 동적 인 데이터 구조에 더 적합합니다.
기술 의존성 : 좋은 Fortran 프로그램을 작성하는 것보다 좋은 C ++ 프로그램을 작성하는 데 훨씬 더 많은 프로그래밍 경험이 필요합니다. 적은 프로그래밍 경험으로 시작하여 업무 측면을 배울 시간이 너무 많으면 C ++을 배우는 것보다 Fortran을 배우는 것이 더 좋습니다. 물론 문제가 Fortran에 적합하다고 가정합니다.
그러나 Fortran과 C ++보다 프로그래밍에 더 많은 것이 있습니다. 파이썬과 같은 역동적 인 고급 언어로 시작하기 위해 계산 과학에 들어가는 사람에게 추천합니다. 항상 시간이 CPU 시간보다 더 중요하다는 것을 기억하십시오!
나는 C ++과 Fortran이 충분하고 잘 작동한다고 생각합니다.
그러나 Fortran은 숫자 과학 컴퓨팅, 배열을 사용하여 표현할 수 있고 다른 정교한 데이터 구조가 필요하지 않은 알고리즘, 유한 차분 / 요소, PDE 솔버, 전자 구조 계산과 같은 분야에서 더 좋습니다. 포트란은 도메인 특정 언어입니다. 특히 과학자 (컴퓨터 과학 전문가 일 필요는 없음)가 C ++보다 Fortran에서 빠른 프로그램 을 작성하는 것이 더 쉽다고 생각합니다 .
C ++은 범용 언어이므로 알고리즘을 표현할 수 있으며 HPC 필드에서 아마도 그래프, 메쉬 생성기, 기호 조작 등 배열을 사용하여 표현할 수없는 알고리즘에 가장 좋습니다.
C ++로 배열 알고리즘을 작성할 수도 있지만 내 경험상 훨씬 더 많은 컴퓨터 과학 지식과 일반적으로 더 많은 작업이 필요합니다 (즉, 배열 조작을 위해 클래스를 만들거나 재사용하고 직접 또는 일부를 사용하여 메모리 관리를 처리해야 함) Trilinos의 Teuchos와 같은 라이브러리). 비전문가들은 꽤 좋은 포트란 프로그램을 작성하는 경향이 있지만, 끔찍한 C ++ 프로그램 (나의 경험에서 나온)입니다.
면책 조항 : 나는 개인적으로 Fortran을 많이 좋아하며 숫자 컴퓨팅을 위해 C ++보다 선호합니다. 나는 매일 C ++에서 2 년 이상 프로그래밍했으며, 현대의 포트란에서 (유한 요소 영역에서) 거의 1 년 동안 프로그래밍했습니다. 나는 Python과 Cython도 많이 사용합니다.
나는 또한 늦게 내 2 센트를 던지고 있지만, 나는 단지이 실을 보았고 후손을 위해 필사적으로 만들어야 할 몇 가지 사항이 있다고 생각합니다.
다음에서는 C ++이 아닌 C에 대해 설명하겠습니다. 왜? 글쎄, 그렇지 않으면 사과와 오렌지는 본격적인 동적 유형 객체 지향 언어를 Fortran과 같은 정적 언어와 비교하는 것입니다. 그렇습니다. 최신 Fortran 표준의 일부 최신 구현은 그 이상의 기능을 수행 할 수 있지만 실제로 사용하는 사람은 거의 없으므로 Fortran에 대해 말할 때 단순하고 정적 인 명령을 사용해야합니다. 그것이 C가있는 곳이므로 C를 C ++로 바꿔서 다음을 수행 할 것입니다.
우선, 더 나은 컴파일러를 가진 Fortran / C에 대한 논의는 무의미합니다. 전용 C / Fortran 컴파일러는 과거의 일입니다. gcc / gfortran과 icc / ifc는 같은 백엔드와 다른 프론트 엔드입니다. 즉, 프로그램은 프론트 엔드에 의해 추상적 인 설명으로 변환 된 후 백엔드에 의해 최적화되고 조립됩니다. 의미 적으로 Fortran 또는 C에서 동일한 코드를 작성하는 경우 컴파일러는 두 경우 모두 동일한 어셈블리를 생성하여 빠르게 실행됩니다.
이것은 이제 두 번째 요점으로 이어집니다. 왜 여전히 차이점을 볼 수 있습니까? 문제는 대부분의 비교는 Fortran 프로그래머가 C에서 무언가를 시도하거나 그 반대로 시도한다는 것입니다. 대부분의 저자 나 시인이 모국어로 글쓰기를 선호하는 것을 보셨습니까? 완전히 자신감이 없거나 집에서 느끼지 않는 언어로시를 쓰시겠습니까? 물론 아니에요. 저는 C 언어를 "기본"프로그래밍 언어로 생각합니다. 그러나 Fortran 만 사용하는 그룹에서 3 년간 일하면서 특정 수준의 유창함을 얻었습니다. 그러나 C에 익숙하기 때문에 Fortran에서 내 자신에 아무것도 쓰지 않으므로 결과 코드가 더 좋을 것 입니다.
따라서 주요 차이점은 언어가 아닌 프로그래머에 있습니다. 차이점이 없습니까? 글쎄요 다음은 몇 가지 예입니다.
SIMD : SSE이든 SSE3이든 AltiVec이든 Fortran에서 사용하려면 컴파일러가 원하는 것을 정확하게 추측 하고 그렇게 할 수 있기를 바랍니다. 행운을 빕니다. C에서는 일반적으로 각 아키텍처 또는보다 최근에는 gcc의 일반 SIMD 벡터 유형에 고유 함수가 있습니다 . 대부분의 포트란 컴파일러는 SIMD 명령어 만 사용하여 루프를 풀지 만, 짧은 데이터 벡터에서 작동하는 커널이 명백하지 않은 경우에는 컴파일러에서이를 볼 수 없을 것입니다.
다양한 하드웨어 아키텍처 : CUDA 아키텍처 전체는 C 커널에 기반을두고 있습니다. 예, 포틀랜드 그룹에는 CUDA 지원 포트란 컴파일러 도 있지만 상용이며 가장 중요한 것은 NVIDIA가 아닙니다. 내가 찾은 최고 는 몇 가지 기본 호출 만 지원하는 최근 프로젝트 입니다.
병렬 프로그래밍 : 그렇습니다. MPI와 OpenMP는 모두 C와 Fortran에서 잘 작동합니다. 그러나 스레드를 실제로 제어하려면, 예를 들어 완전히 동적 인 공유 메모리 계산이있는 경우 Fortran을 사용하십시오. C에는 표준 pthread가 있으며 따뜻하고 애매하지는 않지만 여전히 폭풍을 피할 수 있습니다. 일반적으로 스레드, 프로세스, 파일 시스템 등과 같은 운영 체제에 대한 액세스에 의존하는 대부분의 계산은 C를 사용하는 것이 좋습니다. 오, Fortran을 사용하여 자체 네트워킹을 시도하지 마십시오.
사용 편의성 : Fortran은 C보다 Matlab에 더 가깝습니다. 다양한 키워드와 변수 선언 방법을 모두 익히면 나머지 코드는 Matlab처럼 보이므로 프로그래밍 경험이 제한적인 사용자가보다 쉽게 액세스 할 수 있습니다.
상호 운용성 : C에서 구조체를 만들 때 실제 데이터의 레이아웃은 간단하고 결정적입니다. Fortran에서 포인터 배열 또는 구조화 된 데이터를 사용하는 경우 실제 데이터 레이아웃은 컴파일러에 따라 다르며 간단하지 않으며 일반적으로 완전히 문서화되지 않습니다. Fortran에서 C를 호출 할 수도 있고 그 반대도 가능하지만 정적 배열 이외의 것을 전달하는 것이 쉽지 않을 것이라고 생각하지 마십시오.
이것은 다소 괴짜, 저수준의 것들이지만 이것이 우리가 이야기하는 고성능 컴퓨팅입니다. 기본 하드웨어 패러다임을 최대한 활용하는 방법, 즉 공유 / 분산 메모리, 스레드, SIMD 벡터화, SIMT를 사용하는 GPU 등에 가장 적합한 알고리즘 구현 및 / 또는 개발 방법에 관심이 없다면 컴퓨터에서 수학을하는 것뿐입니다.
이것은 내가 의도 한 것보다 훨씬 오래 걸리므로 요약은 다음과 같습니다.
과학 소프트웨어에 대한 15 년간의 생각에서 : Fortran에서 코드를 작성하여 코드가 25 % 더 빠르게 실행되지만 코드를 작성하는 데 4 배의 시간이 걸립니다 (STL이없고 복잡한 데이터 구조를 구현하는 데 어려움이 있음). 하루 중 상당 부분을 엄지 손가락으로 돌리고 계산이 완료되기를 기다리는 경우에만 승리합니다. 우리 모두에게 가장 귀중한 것은 우리 자신의 시간이라는 결론을 내릴 때 결론은 다음과 같습니다. 언어를 사용하면 가능한 경우보다 느릴 수 있다는 것을 무시하고 코드를 가장 빠르게 개발, 디버그 및 테스트 할 수 있습니다. 당신은 포트란에 썼습니다.
저의 접근 방식은 계산 커널 이외의 모든 것에 C ++을 사용하는 것이 었으며, 일반적으로 어셈블리에서 가장 잘 작성되었습니다. 이를 통해 기존 HPC 접근 방식의 모든 성능을 구매할 수 있지만 Gemm과 같은 SGEMM / DGEMM / CGEMM / ZGEMM과 같은 계산 커널을 단일 루틴으로 오버로드하여 인터페이스를 단순화 할 수 있습니다. 원시 포인터를 피하고 불투명 한 클래스로 전환하면 추상화 수준을 훨씬 더 높일 수 있지만 첫 번째 단계는 훌륭합니다.
C ++의 가장 큰 단점은 컴파일 시간을 압도적으로 늘리는 것이지만, 내 경험상 개발 시간을 절약하는 것이 그 이상입니다. 또 다른 단점은 공급 업체 C ++ 컴파일러가 공급 업체 C 및 포트란 컴파일러보다 버그가 더 많은 경향이 있다는 것입니다. 작년에 C ++ 컴파일러에서 거의 10 가지 버그가 발생했다고 생각합니다.
그와 같이, 저수준 언어 (및 Fortran)로 작성된 과학 패키지의 실행 취소는 복잡한 데이터 구조를위한 편리한 인터페이스를 공개하는 것을 꺼려한다고 생각합니다. 대부분의 사람들은 Fortran BLAS 인터페이스에 만족합니다. 행렬을 설명하기위한 포인터와 선행 차원이지만, 일반적인 40- 정수 Fortran 스파 스-직접 솔버 인터페이스는 편리한 것 (UHM, SuperLU, PETSc 및 Trilinos 참조)에 가깝다고 주장하는 사람은 거의 없습니다.
요약하면, 저수준의 계산 커널에는 어셈블리를 사용하지만 다른 모든 것, 특히 사소한 데이터 구조에서 작동하는 경우에는 더 높은 수준의 언어를 사용한다고 주장합니다.
이 게시물 은 커널 에서 C와 Fortran의 성능을 비교 한 결과입니다 .
나는 여기에 새로 왔기 때문에 오래된 질문을 살펴보고 이것을 찾았습니다. 바라건대 오래된 것들에 대답하는 것은 금기가 아닙니다!
아무도 이것을 언급하지 않았기 때문에 내가 할 것이라고 생각했습니다. Fortran 2003은 최신 릴리스 4.7을 갖춘 대부분의 주요 컴파일러 (인텔, ibm, cray, NAG, PCG)에서도 gcc까지 거의 완벽하게 지원 됩니다. Fortran 2003 (및 2008)은 C ++보다 조금 더 장황하지만 객체 지향 언어입니다. 내가 포트란에 대해 좋은 점 중 하나는 표준위원회가 과학 컴퓨팅을 주요 청중으로 본다는 사실이다 (나는 다른 날 이것을 지적 해 준 데미안 루슨에게 감사한다).
C ++ 프로그래머가 Fortran 프로그래머가되도록 Fortran 90/95에서 C ++로 전환하거나 객체 지향 개념을 에뮬레이션하는 것 외에도 더 많은 옵션이 있음을 알게되었습니다.
내가 추가 할 한 가지주의 할 점은 컴파일러에서 구현 된 것의 최첨단에 비용이 있다는 것입니다. Fortran 2003에서 주요 프로젝트를 수행하고 있다면 버그를 우연히 발견하고 계속해서 컴파일러를 업데이트해야합니다 (특히 gcc를 사용하는 경우). 지난 몇 개월 동안 크게 개선되었습니다!
C ++의 문제점은 STL, 예외, 클래스 (가상 오버 헤드 및 정렬 문제), 연산자 오버로드 (중복 새로 만들기 / 삭제) 또는 템플릿 (결코 종료 및 컴파일 오류를 맹목적으로 사용하는 등)으로 성능을 망칠 수있는 많은 기회가 있다는 것입니다 양성으로 보이지만 이런 식으로 시간을 낭비 할 수 있습니다).
그러나 일반 라이브러리에 더 잘 액세스하고 코드의 가시성을 강하게 얻을 수 있습니다 (필드에 따라 크게 다르지만 여전히 순수한 C를 가지고 있음). R, Lush, Matlab / Scilab 또는 Python, Ruby 또는 Lua와 같은 스크립트 언어로 코드를 래핑하여 Fortran의 유연성 부족을 보완 할 수 있습니다.
세 가지 사실 :
F90의 모듈 시스템은 환경을 구축하기에 적합하지 않게 설계되고 적대적입니다. (예 : 모듈 이름은 파일 이름과 일치하지 않아도됩니다.)
개인적인 인상 :
transfer()
여기 우리가 간다)포트란은 배열 / 매트릭스 계산에 최적화되어 있으며 모든 유형의 텍스트 파싱에 사용하기에 철저한 고통입니다. C와 C ++는 수치 계산에서 Fortran과 일치하지 않을 수도 있지만 C / C ++로 텍스트를 처리하고 데이터 (예 : 사용자 정의 데이터 구조)를 구성하는 것이 훨씬 쉽다는 것을 알았습니다.
다른 사람들이 언급했듯이 동적 해석 언어를 계산하지 마십시오 (Python et al). Fortan의 빠른 속도를 제공하지는 않지만 구현의 모든 세부 사항보다 계산 문제를 해결하는 데 더 집중할 수 있습니다. 종종 파이썬으로 솔루션을 구현할 수 있으며 성능이 만족스럽지 않은 경우 프로파일 링을 수행하고 문제 영역을 식별하며 Cython을 사용하여 해당 코드를 최적화하거나 컴파일 된 언어로 전체 프로그램을 다시 구현하십시오. 문제 해결 논리가 완성되면 나머지는 구현에 불과하며 컴퓨팅 기본 사항을 잘 이해하면 다양한 프로그래밍 언어로 표현하기가 간단해야합니다.
오래된 스레드를 파서 죄송하지만 2015 년에도 포트란이 많이 사용되는 것 같습니다.
방금 2018 년 연구원들에게 제공 될 300 페타 플롭스 서밋 머신에서 DOE의 OCLF 시설이 승인 한 13 개의 코드 목록 인 이 (대체 링크 ) 목록을 발견했습니다. 코드 (빠른 Google 검색 기준)와 여기 내가 찾은 것이 있습니다.
XGC Fortran
SPECFEM Fortran
ACME Fortran (Bunch of climate codes)
DIRAC Fortran (Mostly)
FLASH Fortran
GTC Fortran
HACC C/C++
LS-DALTON Fortran (some C)
NAMD C/C++
NUCCOR Fortran
NWCHEM Fortran
QMCPACK C++
RAPTOR Fortran
따라서 13 개의 코드 중 10 개 (빠른 검색 기준)가 Fortran으로 작성된 것으로 보입니다. 50 년 된 언어에는 나쁘지 않습니다.
참고 : 언어 비교는 쓸모가 없다는 것을 잘 알고 있지만 Fortran을 악용하는 사람들 (특히 C ++ 사용자)의 수를 감안할 때 언급 할 가치가 있다고 생각했습니다.
내가 생각하는 Jack P.는 당신이 섞이고 어울려야한다는 것입니다. 좋은 소프트웨어는 신중하게 계층화되어 있습니다. 다른 레이어는 다른 언어에보다 자연 스럽거나 효율적으로 매핑 될 수 있습니다. 각 레이어에 가장 적합한 언어를 선택해야합니다. 또한 언어가 상호 운용되는 방식을 이해해야합니다. 이는 언어에 따라 선택한 언어에 영향을 줄 수 있습니다.
더 좋은 질문은 계층화 된 소프트웨어를 설계하는 방법을 배우기 위해 공부할 가치가있는 우수한 설계 소프트웨어의 예가 무엇인지에 대한 것입니다.