HPC 용 C ++ 및 포트란


56

내 전산 과학 박사 프로그램에서 우리는 거의 독점적으로 C ++ 및 Fortran에서 일하고 있습니다. 일부 교수는 다른 교수보다 선호하는 것 같습니다. 어떤 상황에서 어떤 것이 더 낫거나 어떤 것이 더 나은지 궁금합니다.


12
내 의견으로는, 고급 언어와 저급 언어의 혼합이 단독으로 사용하는 것보다 낫습니다. 예를 들어 Python + C ++을 사용합니다.
Faheem Mitha

2
이 질문에 대한 답변은 거의 순전히 주관적이므로이 질문이 적절한 지 확실하지 않습니다.
Jeff

답변:


61

종종, 선택은 (1) 해결하려는 문제, (2) 가지고있는 기술 및 (3) 함께 일하는 사람들 (단독 프로젝트가 아닌 경우)에 달려 있습니다. 나는 모든 사람의 개인적인 상황에 달려 있기 때문에 잠시 동안 (3) 남겨 둘 것입니다.

문제 의존성 : 포트란은 어레이 처리에 탁월합니다. 간단한 데이터 구조 및 특정 배열로 문제를 설명 할 수 있으면 Fortran이 적합합니다. 포트란 프로그래머들은 명백하지 않은 경우에도 (예를 들어 그래프를 표현하기 위해) 배열을 사용하게됩니다. C ++는 복잡하고 동적 인 데이터 구조에 더 적합합니다.

기술 의존성 : 좋은 Fortran 프로그램을 작성하는 것보다 좋은 C ++ 프로그램을 작성하는 데 훨씬 더 많은 프로그래밍 경험이 필요합니다. 적은 프로그래밍 경험으로 시작하여 업무 측면을 배울 시간이 너무 많으면 C ++을 배우는 것보다 Fortran을 배우는 것이 더 좋습니다. 물론 문제가 Fortran에 적합하다고 가정합니다.

그러나 Fortran과 C ++보다 프로그래밍에 더 많은 것이 있습니다. 파이썬과 같은 역동적 인 고급 언어로 시작하기 위해 계산 과학에 들어가는 사람에게 추천합니다. 항상 시간이 CPU 시간보다 더 중요하다는 것을 기억하십시오!


17
"항상 CPU 시간보다 시간이 더 중요하다는 것을 기억하십시오!" HPC에서 일하는 사람으로서 나는 그 부분에 동의하지 않습니다. 다른 모든 것이 자리에 있습니다.
Levi Morrison

19
"항상 CPU 시간보다 시간이 더 중요하다는 것을 기억하십시오!" 과학 연구에 종사하는 사람으로서 저는 그 부분에 더 동의 할 수 없었습니다.
decvalts

3
"항상 CPU 시간보다 시간이 더 중요하다는 것을 기억하십시오!" -나는 2 센트를 던지고 싶습니다-몇 주 동안 몇 가지 프로그램을 실행하기 위해 10 개 이상의 코어가있는 수백 개의 노드를 사용하면 몇 주가 더 걸릴 수 있다면 가장 소중한 자원의 끔찍한 낭비로 해석 될 수 있습니다 며칠 만에 실행되는 코드. 이러한 HPC 클러스터는 드물고 비싼 일반 리소스입니다.
Dani_l

"항상 CPU 시간보다 시간이 더 귀중하다는 것을 기억하십시오!", 코드는 일주일 동안 실행되지만 한 달 동안 실행됩니다.
fronthem

6
"항상 CPU 시간보다 귀중한 시간을 기억하십시오!", 나는 한 달 동안 코딩하고 일주일 동안 달리기를 원합니다! -코드를 작성하면 더 많은 작업을 수행 할 수 있으며 다른 사용자가 작성한 코드도 더 유용 할 것입니다.
Charles

37

나는 C ++과 Fortran이 충분하고 잘 작동한다고 생각합니다.

그러나 Fortran은 숫자 과학 컴퓨팅, 배열을 사용하여 표현할 수 있고 다른 정교한 데이터 구조가 필요하지 않은 알고리즘, 유한 차분 / 요소, PDE 솔버, 전자 구조 계산과 같은 분야에서 더 좋습니다. 포트란은 도메인 특정 언어입니다. 특히 과학자 (컴퓨터 과학 전문가 일 필요는 없음)가 C ++보다 Fortran에서 빠른 프로그램 을 작성하는 것이 더 쉽다고 생각합니다 .

C ++은 범용 언어이므로 알고리즘을 표현할 수 있으며 HPC 필드에서 아마도 그래프, 메쉬 생성기, 기호 조작 등 배열을 사용하여 표현할 수없는 알고리즘에 가장 좋습니다.

C ++로 배열 알고리즘을 작성할 수도 있지만 내 경험상 훨씬 더 많은 컴퓨터 과학 지식과 일반적으로 더 많은 작업이 필요합니다 (즉, 배열 조작을 위해 클래스를 만들거나 재사용하고 직접 또는 일부를 사용하여 메모리 관리를 처리해야 함) Trilinos의 Teuchos와 같은 라이브러리). 비전문가들은 꽤 좋은 포트란 프로그램을 작성하는 경향이 있지만, 끔찍한 C ++ 프로그램 (나의 경험에서 나온)입니다.

면책 조항 : 나는 개인적으로 Fortran을 많이 좋아하며 숫자 컴퓨팅을 위해 C ++보다 선호합니다. 나는 매일 C ++에서 2 년 이상 프로그래밍했으며, 현대의 포트란에서 (유한 요소 영역에서) 거의 1 년 동안 프로그래밍했습니다. 나는 Python과 Cython도 많이 사용합니다.


1
첫 번째 답변은 균형을 잡았습니다. C ++과 Fortran이 현재 HPC의 유일한 가능성은 아니라고 생각합니다. Fortran, C ++ 또는 Python (또는 원하는대로)을 결정할 때 강점과 약점을 아는 것이 좋습니다. 나는 하나의 파일에서 20.000 라인의 포트란을 보았으며 수십 년 동안 유기적으로 성장했습니다. 나는 개인적으로 고립 된 헤비 어레이 컴퓨팅 이외의 다른 용도로는 사용하지 않을 것입니다. 출력과 관련된 것도 아닙니다. 편견에 대한 의견.
shuhalo

6
이 답변에 더 동의하지 않았습니다. 우리의 유한 요소 코드는 Fortran에서 쓸 수 없었을 것입니다. 실제로, 그것은 15 년 전에 일반 C와 포트란 (방법의 숫자가 많은 부분을위한 것)의 혼합으로 시작되었으며 몇 년에 걸쳐 점차 순수 C로 이동 한 다음 C ++로 이동했습니다. 코드는 일관되게 짧고 빠르며 이해하기 쉬워졌으며 각 반복 후에 더 많은 기능을 수행했습니다. 나는 C ++이 당신을 쏠 수있는 많은 밧줄을 준다는 다른 사람들과 동의합니다. 가장 편한 언어를 선택하십시오.
Bill Barth

6
빌, 현대 포트란 (90 이상 추가)을 사용하셨습니까? 이것은 매우 중요합니다 (이에 대한 대답에서 더 분명해야했습니다). 물론, "20.000 라인의 포트란"또는 f77은 일반적으로 잘 작성된 C ++보다 좋지 않습니다.
Ondřej Čertík

1
@ OndřejČertík : 현대의 유한 요소 프로그램이 "간단한"데이터 구조를 사용한다고 생각한다면 최근에는 그 중 어떤 것도 보지 못했다고 생각합니다. 간단한 데이터 구조를 사용하여 비정형 메시에 적응 형 유한 요소, hp 메소드 또는 멀티 그리드를 구현해보십시오. 빌은 자리를 잡았으며 "현대 포트란"을 사용하는 것이 그다지 큰 차이를 만들지 않았다고 말할 수 있습니다.
Wolfgang Bangerth 2012 년

6
@WolfgangBangerth, 예를 들어 언급 한 거의 모든 포트란 구현에 대해서는 Phaml ( math.nist.gov/phaml )을 참조하십시오 .
Ondřej Čertík

31

나는 또한 늦게 내 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 등에 가장 적합한 알고리즘 구현 및 / 또는 개발 방법에 관심이 없다면 컴퓨터에서 수학을하는 것뿐입니다.

이것은 내가 의도 한 것보다 훨씬 오래 걸리므로 요약은 다음과 같습니다.

  • 당신은 최고의 코드를 작성합니다 당신은 언어로 할 수있는 당신이 가장 잘 알고있다.
  • 동일한 백엔드를 사용하는 두 컴파일러에서 생성 한 코드 품질에는 차이가 없습니다 . 한 언어 또는 다른 언어로 잘못된 코드를 작성 하는 것은 우리 입니다.
  • 더 낮은 수준의 느낌에도 불구하고 Fortran은 상당히 높은 수준의 추상화이며 SIMD, 스레드, 네트워킹 등과 같은 특정 하드웨어 / OS 기능에 직접 액세스 할 수 없습니다.

5
좋은 반응. 그러나 귀하의 최종 의견이 반드시 사실이라고 생각하지 않습니다. 저는 C 프로그래머이지만, 훌륭한 프로그래밍 방법을 통해 Fortran의 저수준에 접근 할 수 있습니다. SIMD ops와 같은 것을 사용하는 이상적인 방법은 코드를 강력하게 제안하는 코드를 작성하고 (예를 들어, 루프 차단) 컴파일러가이를 수행하도록하는 것입니다. 스레딩의 경우 단순히 openMP를 사용하십시오 (pthreads는 추가 작업으로도 사용할 수 있습니다). 포트란은 일반적인 사용자에게 중요한 수준 인 수치와 같이 언급하지 않은 모든 것을 가지고 있습니다.
Reid. Atcheson

@ Reid.Atcheson : 글쎄, 컴파일러가 잡을 수 있도록 모든 것을 차단하면 C와 Fortran에서 자동으로 작동합니다. 그러나 문제는 컴파일러를 얼마나 멀리 신뢰하고 싶습니까? 무엇을 원하는지 정확히 알고있을 때 왜 신뢰해야 합니까? OpenMP는 스레딩을 수행하지만 블록 단위로 수행합니다. 다른 스레드 풀이 다른 작업을 수행하도록 속일 수는 있지만 OpenMP를 잘못 사용하고 있습니다. Fortran의 Pthread는 C 함수의 래퍼입니다. 그러나 세부 사항에 속하지 않으면 Fortran이 더 쉽다는 데 동의합니다.
Pedro

1
물론 컴파일러에 의존하여 99 %의 최대 효율을 얻을 수는 없지만 쉽게 접근 할 수 있습니다. 이 외에도 내장 또는 인라인 ASM을 사용해야합니다. 전반적인 프로그래머 효율성을 위해 어딘가에 양보를해야하므로 프로그래밍 언어가 처음에 존재합니다. 본질적으로 ASM (내가 몇 번이나)에 대한 세부 정보를 얻을 수있을 정도로 미쳤던 단계에서 Fortran은 목발이 아닙니다. 어쨌든 수동으로 최적화 된 코드를 연결하는 방법을 알고 있습니다.
Reid. Atcheson

@ Reid.Atcheson : 병렬 HPC 응용 프로그램의 경우 99 %의 최대 효율보다 훨씬 낮은 결과를 초래할 수 있다고 주장합니다. gcc 벡터 유형은 내장 함수를 사용하여 문제가되지 않습니다 :)
Pedro

1
@Pedro, 화려한 포스트. 절대적으로 훌륭합니다. 게시 해 주셔서 감사합니다. 흥미로운 스레드를 무작위로 뒤엎는 동안 발견했습니다.
Inquest

16

과학 소프트웨어에 대한 15 년간의 생각에서 : Fortran에서 코드를 작성하여 코드가 25 % 더 빠르게 실행되지만 코드를 작성하는 데 4 배의 시간이 걸립니다 (STL이없고 복잡한 데이터 구조를 구현하는 데 어려움이 있음). 하루 중 상당 부분을 엄지 손가락으로 돌리고 계산이 완료되기를 기다리는 경우에만 승리합니다. 우리 모두에게 가장 귀중한 것은 우리 자신의 시간이라는 결론을 내릴 때 결론은 다음과 같습니다. 언어를 사용하면 가능한 경우보다 느릴 수 있다는 것을 무시하고 코드를 가장 빠르게 개발, 디버그 및 테스트 할 수 있습니다. 당신은 포트란에 썼습니다.


13

저의 접근 방식은 계산 커널 이외의 모든 것에 C ++을 사용하는 것이 었으며, 일반적으로 어셈블리에서 가장 잘 작성되었습니다. 이를 통해 기존 HPC 접근 방식의 모든 성능을 구매할 수 있지만 Gemm과 같은 SGEMM / DGEMM / CGEMM / ZGEMM과 같은 계산 커널을 단일 루틴으로 오버로드하여 인터페이스를 단순화 할 수 있습니다. 원시 포인터를 피하고 불투명 한 클래스로 전환하면 추상화 수준을 훨씬 더 높일 수 있지만 첫 번째 단계는 훌륭합니다.

C ++의 가장 큰 단점은 컴파일 시간을 압도적으로 늘리는 것이지만, 내 경험상 개발 시간을 절약하는 것이 그 이상입니다. 또 다른 단점은 공급 업체 C ++ 컴파일러가 공급 업체 C 및 포트란 컴파일러보다 버그가 더 많은 경향이 있다는 것입니다. 작년에 C ++ 컴파일러에서 거의 10 가지 버그가 발생했다고 생각합니다.

그와 같이, 저수준 언어 (및 Fortran)로 작성된 과학 패키지의 실행 취소는 복잡한 데이터 구조를위한 편리한 인터페이스를 공개하는 것을 꺼려한다고 생각합니다. 대부분의 사람들은 Fortran BLAS 인터페이스에 만족합니다. 행렬을 설명하기위한 포인터와 선행 차원이지만, 일반적인 40- 정수 Fortran 스파 스-직접 솔버 인터페이스는 편리한 것 (UHM, SuperLU, PETSc 및 Trilinos 참조)에 가깝다고 주장하는 사람은 거의 없습니다.

요약하면, 저수준의 계산 커널에는 어셈블리를 사용하지만 다른 모든 것, 특히 사소한 데이터 구조에서 작동하는 경우에는 더 높은 수준의 언어를 사용한다고 주장합니다.

이 게시물 은 커널 에서 C와 Fortran의 성능을 비교 한y:=αx+y 결과입니다 .


2
작은 커널을 컴파일 할 목적으로 적절한 최적화가 가능한 표준 C 컴파일러를 신뢰하지 않는 이유는 무엇입니까? 이 수준의 코드 크기와 복잡성에서 컴파일러가 가져올 수있는 것의 차이는 분명하지 않습니다.
Peter Brune

1
나는 적절한 제한 사용으로도 포트란이 명시 적 행렬 전치와 같은 일부 연산에서 C 및 / 또는 C ++ 코드보다 여전히 빠르다고 나에게 말한 여러 사람들과 이야기했습니다. C 또는 C ++ 코드를 빠르게 만들 수는 없지만 Fortran 컴파일러가 더 나은 작업을 수행하는 경향이 있다고 말하지는 않습니다.
Jack Poulson

"restrict"키워드와 동일한 경험을 가지고 있습니다 (단순한 포트란 코드는 항상 조금 빠릅니다). 그러나 내 전문 지식은 제한되어 있으며 gcc에서 생성 된 어셈블리를 이해하는 데 투자 할 시간이 없습니다. 그래서 저는 간단히 포트란을 사용합니다. 간단하고 빠릅니다.
Ondřej Čertík

@ JackPoulson : 컴파일러 논쟁은 Fortran 커뮤니티에서 꽤 많이 들었습니다. 불행하게도, gcc 또는 ifc / icc와 같은 대부분의 컴파일러는 동일한 백엔드에 대해 다른 언어 프론트 엔드를 사용합니다. 최적화와 코드 생성을 수행하는 기계는 동일하므로 결과의 차이는 아마도 기본 언어에 대한 프로그래머의 친숙함에 차이가있을 수 있습니다.
Pedro

1
포트란이 수치 커널에서 더 빠르다는 자주 반복되고 거의 검증되지 않은 주장에 대해 약간의 관점을 제시하기 위해 : Trilinos의 Epetra 패키지에서 희소 행렬 벡터가 곱하는 것보다 30 % 느리다는 것을 알았습니다. 거래 II. 전자는 Fortran 77로 작성되었고 후자는 '제한'을 사용하지 않고 C로 작성되었습니다. 둘 다 약 10-15 줄의 코드를 가졌습니다. 오늘날 Trilinos는 거래에서 들어온 코드를 사용합니다 .II. F77이 C보다 빠른 경우를 많이 찾을 수 있다고 확신합니다. 요점은 오늘날 더 이상 보편적이지 않습니다.
Wolfgang Bangerth

8

나는 여기에 새로 왔기 때문에 오래된 질문을 살펴보고 이것을 찾았습니다. 바라건대 오래된 것들에 대답하는 것은 금기가 아닙니다!

아무도 이것을 언급하지 않았기 때문에 내가 할 것이라고 생각했습니다. Fortran 2003은 최신 릴리스 4.7을 갖춘 대부분의 주요 컴파일러 (인텔, ibm, cray, NAG, PCG)에서도 gcc까지 거의 완벽하게 지원 됩니다. Fortran 2003 (및 2008)은 C ++보다 조금 더 장황하지만 객체 지향 언어입니다. 내가 포트란에 대해 좋은 점 중 하나는 표준위원회가 과학 컴퓨팅을 주요 청중으로 본다는 사실이다 (나는 다른 날 이것을 지적 해 준 데미안 루슨에게 감사한다).

C ++ 프로그래머가 Fortran 프로그래머가되도록 Fortran 90/95에서 C ++로 전환하거나 객체 지향 개념을 에뮬레이션하는 것 외에도 더 많은 옵션이 있음을 알게되었습니다.

내가 추가 할 한 가지주의 할 점은 컴파일러에서 구현 된 것의 최첨단에 비용이 있다는 것입니다. Fortran 2003에서 주요 프로젝트를 수행하고 있다면 버그를 우연히 발견하고 계속해서 컴파일러를 업데이트해야합니다 (특히 gcc를 사용하는 경우). 지난 몇 개월 동안 크게 개선되었습니다!


7

C ++의 문제점은 STL, 예외, 클래스 (가상 오버 헤드 및 정렬 문제), 연산자 오버로드 (중복 새로 만들기 / 삭제) 또는 템플릿 (결코 종료 및 컴파일 오류를 맹목적으로 사용하는 등)으로 성능을 망칠 수있는 많은 기회가 있다는 것입니다 양성으로 보이지만 이런 식으로 시간을 낭비 할 수 있습니다).

그러나 일반 라이브러리에 더 잘 액세스하고 코드의 가시성을 강하게 얻을 수 있습니다 (필드에 따라 크게 다르지만 여전히 순수한 C를 가지고 있음). R, Lush, Matlab / Scilab 또는 Python, Ruby 또는 Lua와 같은 스크립트 언어로 코드를 래핑하여 Fortran의 유연성 부족을 보완 할 수 있습니다.


1
일반적으로 저급 기술을 고급 언어로 적용하는 것은 좋지 않습니다. 예를 들어, STL은 매우 추상적 인 수준에서 작동하도록 설계되었습니다. 인터페이스가 무엇을 위해 설계되었는지 알고이 작업에 사용하고 컴파일러에서 빠져 나가야합니다.
shuhalo

2
나는 mbq와 Martin의 요점이 불공평하다고 생각합니다. 그렇습니다. std :: list <double>을 사용하여 선형 대수 목적으로 숫자 벡터를 구현하려고 시도하면 발로 자신을 쏠 수있는 방법이 있습니다. 그러나 그것은 바보 같은 주장입니다. 적어도 C ++ 에는 사용할 수있는 링크 된 목록 클래스가 있지만 Fortran은 그렇지 않습니다. "자동차는 빠른 속도로 운전하여 벽에 부딪쳐 부상을 입을 수 있습니다. 대신 말이 끄는 마차를 사용해야합니다." 그것은을 위해 또한 낮은 수준의 물건을 지원하는 고급 언어 (예를 들어 C ++)를 휴지통 단지 바보 같은 생각 가진 높은 수준의 기능을.
Wolfgang Bangerth

@WolfgangBangerth 아니오, 지금 당신은 Fortran을 아프게합니다. 박테리아는 인간보다 "낮게 진화 된"것처럼 "낮은 수준"입니다. 자동차 비유를 원한다면 "지프와 렉서스를 모두 사용하여 늪지대를 건너 갈 수 있지만 첫 번째 차를 사용하는 것이 덜 아프다."
mbq

1
나는 당신의 의견에 감사하지만, Fortran이 C ++만큼 진화하지 않았다고 주장합니다 :-)
Wolfgang Bangerth

7

세 가지 사실 :

  • C의 F77 스타일 n 차원 배열 : CnD 사용에 문제가 없음 ( 분명한 플러그)

  • F90의 모듈 시스템은 환경을 구축하기에 적합하지 않게 설계되고 적대적입니다. (예 : 모듈 이름은 파일 이름과 일치하지 않아도됩니다.)

  • 포트란은 리팩토링을 잘 지원하지 않습니다. 함수에서 약간의 기능을 가져 오려면 실제 코드, 변수 선언, 인수 선언 및 인수 목록의 네 곳을 터치해야합니다. C는 두 곳을 만질 수있다. 이로 인해 데이터 관리가 잘되지 않는 결과가 초래됩니다 (아래 설명 참조). 소규모 모듈 식은 매우 고통스럽기 때문에 거의 모든 사람이 거대한 서브 루틴을 작성합니다.

개인적인 인상 :

  • 포트란은 데이터 관리에 적합하지 않습니다. F77 또는 F90에서 사용자가 불투명 한 데이터 구조에 대한 포인터를 반환하십시오. ( transfer()여기 우리가 간다)

안드레아스 안녕! CnD는 흥미 롭습니다. 아, 썼어 :) (f90은 슬라이싱, 배열 할당 가능, 가장 중요하게는 곱셈, 덧셈 등의 배열 구문 지원)을 지원합니다. Fortran과 함께 CMake를 사용하며 모듈에서 잘 작동합니다. "인수 목록"은 정확히 무엇입니까? 나는 이것들을 사용하지 않는다고 생각하기 때문에 3 곳만 수정하면됩니다. C에서는 일반적으로 실제 코드, 매개 변수 및 헤더 파일을 수정해야하므로 3 자리 (대부분 C ++)도 있습니다. 예, transfer ()는 훌륭하지 않지만 실제로는 실제로 필요하지 않습니다.
Ondřej Čertík

3
현대 포트란을 리팩토링하는 것은 일식에서 Photran과 같은 적절한 IDE를 사용하는 것이 쉽지 않습니다.

2
"모듈 이름은 파일 이름과 일치하지 않아도됩니다."농담해야합니다. 한 파일에 많은 모듈이있을 수 있습니다. 그들 중 일부는 몇 줄에 걸쳐 있습니다. 각각에 대해 파일을 만들 필요가없는 경우 훨씬 쉽게 만들 수 있습니다.
Vladimir F

1
@ user389가 말한 것을 덧붙이고 싶었지만 Photran은 훌륭하고 리팩토링을 허용하는 유일한 포트란 IDE이지만 파서는 항상 실패합니다. 반면에 Eclipse가 메모리가 부족하다는 사실에 대해서는 언급 할 필요가 없습니다.
astrojuanlu

5

포트란은 배열 / 매트릭스 계산에 최적화되어 있으며 모든 유형의 텍스트 파싱에 사용하기에 철저한 고통입니다. C와 C ++는 수치 계산에서 Fortran과 일치하지 않을 수도 있지만 C / C ++로 텍스트를 처리하고 데이터 (예 : 사용자 정의 데이터 구조)를 구성하는 것이 훨씬 쉽다는 것을 알았습니다.

다른 사람들이 언급했듯이 동적 해석 언어를 계산하지 마십시오 (Python et al). Fortan의 빠른 속도를 제공하지는 않지만 구현의 모든 세부 사항보다 계산 문제를 해결하는 데 더 집중할 수 있습니다. 종종 파이썬으로 솔루션을 구현할 수 있으며 성능이 만족스럽지 않은 경우 프로파일 링을 수행하고 문제 영역을 식별하며 Cython을 사용하여 해당 코드를 최적화하거나 컴파일 된 언어로 전체 프로그램을 다시 구현하십시오. 문제 해결 논리가 완성되면 나머지는 구현에 불과하며 컴퓨팅 기본 사항을 잘 이해하면 다양한 프로그래밍 언어로 표현하기가 간단해야합니다.


맞습니다. 텍스트 구문 분석에는 Python도 사용합니다.
Ondřej Čertík

C ++과 같은 컴파일 된 언어로 파이썬 스크립트의 일부를 구현하고이를 연결할 수도 있습니다. 예 : Python, Swig 등을 부스트하십시오.
Faheem Mitha

4

저는 현재 국립 연구소에서 일하고 있습니다. 내 주변 사람들의 대부분은 기계 엔지니어입니다. HPC 그룹의 일부 사람들과 대화하면서 Linux와 C ++를 주로 사용합니다. 현재 내가 속한 그룹은 대부분 데스크톱 응용 프로그램을 수행하며 Windows와 C #, FORTRAN, Python, VBA 및 VB (.NET이 아닌 6)를 내림차순으로 사용합니다. 우리가 사용 하는 시뮬레이션 엔진 중 일부는 FORTRAN의 다른 국립 연구소에서 작성되었습니다.


4

오래된 스레드를 파서 죄송하지만 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 ++ 사용자)의 수를 감안할 때 언급 할 가치가 있다고 생각했습니다.


3
국립 연구소에서의 경험이 그 반대 였기 때문에 동의하지 않습니다. Lawrence Livermore에서 볼 수있는 대부분의 새 프로젝트는 C ++로 작성되었으며 ODE 솔버, FEM 이산화 및 범용 과학 컴퓨팅 라이브러리의 최신 (또는 적극적으로 유지 관리되는) 최신 오픈 소스 라이브러리의 대부분 C 또는 C ++에있는 것 같습니다. 포트란은 기존 / 레거시 라이브러리를 사용하는 프로젝트에서 주로 사용되는 것 같습니다. 언어에 대한 생각과는 별도로 Fortran을 사용하는 크고 새로운 프로젝트가 많이 보이지 않습니다.
Geoff Oxberry

Fortran으로 작성된 일부 밀도 기능 이론 코드에는 VASPCASTEP가 포함 되지만 @GeoffOxberry가 지적했듯이 새로운 프로젝트는 아마도 C ++로 향하는 경향이 있습니다.
dr.blochwave

@blochwave 링크에서 읽을 수 있듯이 프로젝트는 2018 년에 온라인으로 제공되는 새로운 머신 (가속기 등)을위한 것입니다. 공연. 위의 목록에있는 코드의 많은 부분이 새 코드에서와 같이 다시 작성되었거나 다시 작성되었다고 확신합니다. 많은 "새로운"기후 코드가 포트란에도 있으며 여러 국가의 많은 기관에서 사용하고 있습니다.
stali

0

내가 생각하는 Jack P.는 당신이 섞이고 어울려야한다는 것입니다. 좋은 소프트웨어는 신중하게 계층화되어 있습니다. 다른 레이어는 다른 언어에보다 자연 스럽거나 효율적으로 매핑 될 수 있습니다. 각 레이어에 가장 적합한 언어를 선택해야합니다. 또한 언어가 상호 운용되는 방식을 이해해야합니다. 이는 언어에 따라 선택한 언어에 영향을 줄 수 있습니다.

더 좋은 질문은 계층화 된 소프트웨어를 설계하는 방법을 배우기 위해 공부할 가치가있는 우수한 설계 소프트웨어의 예가 무엇인지에 대한 것입니다.

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