내 컴퓨터 과학 박사 프로그램에서 우리는 거의 독점적으로 C ++와 Fortran으로 작업하고 있습니다. 어떤 교수들은 다른 것보다 하나를 선호하는 것 같습니다. 특정 상황에서 어떤 것이 “더 나은지”또는 어떤 것이 다른 것보다 나은지 궁금합니다.
댓글
- 저수준 언어는 둘 중 하나만 사용하는 것보다 낫다고 생각합니다. 예 : 저는 Python + C ++를 사용합니다.
- 이 질문에 대한 답변은 거의 순전히 주관적이므로 ‘이 질문이 적절한 지 잘 모르겠습니다.
답변
수시로 선택은 (1) 해결하려는 문제, (2) 보유한 기술 및 (3) 함께 일하는 사람들 ( “솔로 프로젝트가 아닌 경우). 모든 사람의 개별 상황에 따라 다르기 때문에 (3) 잠시 놔둘 것입니다.
문제 의존성 : Fortran은 배열 처리에 탁월합니다. 문제를 간단한 데이터 구조 및 특정 배열로 설명 할 수있는 경우 Fortran은 잘 적용됩니다. Fortran 프로그래머는 결국 명확하지 않은 경우 (예 : 그래프 표시)에서도 배열을 사용합니다. C ++는 복잡하고 매우 동적 인 데이터 구조에 더 적합합니다.
기술 의존성 : 좋은 Fortran 프로그램을 작성하는 것보다 좋은 C ++ 프로그램을 작성하려면 훨씬 더 많은 프로그래밍 경험이 필요합니다. 경험을 쌓고 업무의 해당 측면을 배울 시간이 너무 많으면 C ++를 배우는 것보다 Fortran을 배우는 것보다 더 나은 투자 수익을 얻을 수 있습니다. 물론 문제가 Fortran에 적합하다고 가정합니다.
그러나 Fortran과 C ++뿐 아니라 프로그래밍에는 더 많은 것이 있습니다. 전산 과학에 들어가는 모든 사람에게 동적 고점으로 시작하는 것이 좋습니다. Python과 같은 수준의 언어. 시간이 CPU 시간보다 더 중요하다는 점을 항상 기억하세요!
댓글
- ” 당신의 시간은 CPU 시간보다 더 소중합니다! ” HPC에서 일하는 사람으로서 저는 그 부분에 동의하지 않습니다. 그 밖의 모든 것들이 있습니다.
- ” 당신의 시간이 CPU 시간보다 더 소중하다는 것을 항상 기억하세요! ” 과학 연구 분야에서 일하는 사람은 ‘이 부분에 더 동의 할 수 없었습니다.
- ” 항상 기억하십시오. 시간이 CPU 시간보다 더 중요합니다. “-저는 ‘ 2 센트를 투자하고 싶습니다. 각각 수백 개의 노드를 사용합니다. 몇 주 동안 일부 프로그램을 실행하기 위해 10 개 이상의 코어를 사용하는 것은 몇 주만 더 실행되는 코드를 며칠 만에 생성 할 수 있다면 가장 귀중한 리소스의 끔찍한 낭비로 해석 될 수 있습니다. 이러한 HPC 클러스터는 드물고 값 비싼 공통 리소스입니다.
- ” 시간이 CPU 시간보다 더 중요하다는 것을 항상 기억하세요! “, 코드는 일주일 동안 실행되지만 한 달 동안 실행됩니다. ‘ 매우 평범합니다.
- ” 당신의 시간이 CPU 시간보다 더 중요하다는 것을 항상 기억하세요! “, 저는 한 달 동안 코딩하고 일주일 안에 실행하고 싶습니다! -코드가 작성되면 더 많은 작업을 수행 할 수 있으며 다른 사람들도 작성한 코드가 더 유용하다는 것을 알게 될 것입니다.
답변
C ++와 Fortran 모두 충분하고 잘 작동한다고 생각합니다.
그러나 Fortran은 다음을 사용하여 표현할 수있는 알고리즘의 숫자 과학 컴퓨팅에 더 적합하다고 생각합니다. 다른 정교한 데이터 구조가 필요하지 않으므로 유한 차분 / 요소, PDE 솔버, 전자 구조 계산과 같은 분야에서 사용됩니다. Fortran은 도메인 특정 언어입니다. 특히 빠른 작성하기가 더 쉽다고 생각합니다. em> 프로그램은 과학자 (반드시 컴퓨터 과학 전문가 일 필요는 없음)가 C ++보다 Fortran에서 프로그램합니다.
C ++는 범용 언어이므로 모든 알고리즘을 표현할 수 있으며 가장 확실합니다. 배열을 사용하여 표현할 수없는 알고리즘의 경우 HPC 필드에서 아마도 일부 그래프, 메시 생성기, 기호 조작 등을 사용할 수 있습니다.
arra를 작성하는 것도 가능합니다. y 알고리즘을 C ++로 만들었지 만 제 경험상 훨씬 더 많은 컴퓨터 과학 지식과 일반적으로 더 많은 작업이 필요합니다 (예 : 배열 조작을 위해 클래스를 생성하거나 재사용하고 메모리 관리를 직접 또는 Trilinos의 Teuchos와 같은 라이브러리를 사용하여 처리해야합니다). 비전문가는 꽤 좋은 Fortran 프로그램을 작성하는 경향이 있지만 끔찍한 C ++ 프로그램 (내 경험에 따르면)입니다.
면책 조항 : 개인적으로 Fortran을 많이 좋아하고 숫자 계산을 위해 C ++보다 선호합니다. 저는 매일 C ++로 2 년 이상 프로그래밍을했고, 현대 Fortran에서 매일 (유한 요소 영역에서) 프로그래밍하는 데 거의 1 년을 보냈습니다. 저는 Python과 Cython도 많이 사용합니다.
댓글
- 첫 번째 답변이 균형을 이루고 있습니다. 현대 HPC에서 C ++와 Fortran만이 유일한 가능성은 아니라고 생각합니다. Fortran, C ++ 또는 Python (또는 원하는대로)을 결정할 때 강점과 약점을 아는 것이 좋습니다. 하나의 파일에서 수십 년에 걸쳐 유기적으로 성장한 20.000 라인의 Fortran을 보았습니다. 개인적으로 고립 된 무거운 어레이 컴퓨팅 이외의 다른 용도로는 사용하지 않을 것입니다. 출력과 관련된 것도 아닙니다. 지금까지 편향된 댓글입니다.
- ‘이 응답에 더 이상 동의하지 않을 수 없습니다. 우리의 유한 요소 코드는 Fortran에서 작성하는 것이 불가능했을 것입니다. 사실, 그것은 15 년 전에 일반 C와 Fortran (후자는 메서드의 수치 집약적 인 부분을위한 것임)의 혼합으로 시작되었고, 몇 년에 걸쳐 점차적으로 순수 C로 이동 한 다음 C ++로 이동했습니다. 코드는 지속적으로 짧아지고, 빠르고, 이해하기 쉬워졌고, 반복 할 때마다 더 많은 능력을 발휘했습니다. 나는 C ++가 당신을 쏠 수있는 많은 로프를 제공한다고 지적하는 다른 사람들의 의견에 동의합니다. ‘ 가장 편한 언어를 선택하세요.
- Bill, 최신 Fortran을 사용 하셨나요 (90 이상 추가 되었나요?). 이것은 매우 중요합니다 (나는 이것에 대한 내 대답에서 더 명시 적 이었어 야했습니다). 물론 ” 20.000 줄의 Fortran ” 또는 f77은 일반적으로 잘 작성된 C ++보다 낫지 않습니다.
- @ OndřejČert í k : 현대 유한 요소 프로그램이 ” 간단한 ” 데이터 구조의 경우 최근에 ‘ 어떤 것도 보지 않았습니다. 간단한 데이터 구조를 사용하여 구조화되지 않은 메시에 적응 형 유한 요소, hp 방법 또는 멀티 그리드를 구현해보십시오. Bill이 자리를 잡았습니다. 저는 ” 현대적인 Fortran “을 사용하면 적은 돈을 벌 수 있다고 말할 수 있습니다.
- @WolfgangBangerth, 예를 들어 Phaml ( math.nist.gov/phaml )에서 거의 모든 당신이 언급했습니다.
답변
저도 2 센트를 늦게 던지고 있습니다. 방금이 스레드를 보았을 뿐이며 후대를 위해 필사적으로 작성해야 할 몇 가지 사항이 있다고 생각합니다.
다음에서 C ++가 아닌 C에 대해 이야기 할 것입니다. 왜? 글쎄요, 그렇지 않으면 동적으로 형식이 지정된 완전한 객체 지향 언어를 Fortran과 같은 정적 언어와 비교하는 것은 사과와 오렌지입니다. 예, 최신 Fortran 표준의 일부 최신 구현은 그 이상의 기능을 수행 할 수 있지만 실제로는 극소수입니다. Fortran에 대해 말할 때 우리는 단순하고 정적이고 명령적인 언어라고 생각합니다. C도 그렇기 때문에 다음을 위해 C를 C ++로 대체하겠습니다.
첫 번째 모두, 더 나은 컴파일러를 갖는 Fortran / C에 대한 논의는 문제가 있습니다. 전용 C / Fortran 컴파일러는 과거의 일입니다. gcc / gfortran과 icc / ifc는 동일한 백엔드, 즉 프로그램에 대한 다른 프런트 엔드입니다. 프론트 엔드에 의해 추상적 인 설명으로 변환 된 다음 백 엔드에 의해 최적화되고 어셈블됩니다. 의미 론적으로 Fortran 또는 C로 동일한 코드를 작성하면 컴파일러는 두 경우 모두 동일한 어셈블리를 생성합니다. 빠르게 실행됩니다.
이제 두 번째 요점으로 이어집니다. 왜 여전히 diff가 표시됩니까? erences? 문제는 대부분의 비교는 Fortran 프로그래머가 C에서 무언가를 시도하거나 그 반대의 경우에 수행된다는 것입니다. 대부분의 작가 나 시인이 자신의 모국어로 글을 쓰는 것을 선호하는 방법을 본 적이 있습니까? 완전히 자신감이 없거나 집에서 느껴지지 않는 언어로시를 쓰고 싶습니까? 물론 아닙니다 … 저는 C를 제 “모국어”프로그래밍 언어로 생각합니다.하지만 3 년을 보냈습니다. Fortran 만 사용하는 그룹에서 일하면서 특정 수준의 유창함을 얻었습니다.하지만 C에 더 익숙해 져 결과적으로 결과 코드가 더 익숙해 지므로 Fortran에서 혼자서는 어떤 것도 작성하지 않습니다. 무엇을 정의하든 더 나아질 것입니다.
그러므로 주요 차이점은 언어가 아니라 프로그래머에 있습니다. 그래서 차이가 없습니까? 글쎄요. 다음은 몇 가지 예입니다.
-
SIMD : SSE, SSE3 또는 AltiVec이든 Fortran에서 사용하려면 컴파일러가 추측하기를 바라며기도하는 것이 좋습니다. 정확하게 원하는대로 수행합니다. 행운을 빕니다. C에서는 일반적으로 각 아키텍처에 대한 내장 함수가 있거나 최근에는 일반적인 SIMD 벡터 유형이 있습니다. 대부분의 Fortran 컴파일러는 루프를 풀기 위해 SIMD 명령어 만 사용하지만, 짧은 데이터 벡터에서 명확하지 않은 방식으로 작동하는 커널이있는 경우 컴파일러는이를 인식하지 못할 것입니다.
-
다양한 하드웨어 아키텍처 : 전체 CUDA 아키텍처는 C의 커널을 기반으로 구축되었습니다. 예, Portland Group은 이제 CUDA를 보유하고 있습니다. -가능 포트란 컴파일러 도 있지만, “상용”이며 가장 중요한 것은 NVIDIA가 아닙니다. OpenCL도 마찬가지입니다. 내가 찾을 수있는 최선의 방법은 몇 가지 기본 호출 만 지원하는 최근 프로젝트 입니다.
-
병렬 프로그래밍 : 예, MPI와 OpenMP는 모두 C와 Fortran에서 잘 작동합니다. 그러나 스레드의 실제 제어를 원하는 경우, 즉 완전히 동적 공유 메모리 계산이있는 경우 Fortran을 사용하면 추위에 빠질 것입니다. C에서는 따뜻하고 모호하지는 않지만 표준 pthread가 있습니다. 일반적으로 스레드, 프로세스, 파일 시스템 등과 같이 운영 체제에 대한 액세스에 의존하는 대부분의 계산은 C를 사용하는 것이 더 좋습니다. 오, 직접 수행하려고하지 마십시오. Fortran과의 네트워킹.
-
사용 편의성 : Fortran은 C보다 Matlab에 더 가깝습니다. 다양한 키워드와 변수 선언 방법을 모두 살펴보면 나머지 코드는 Matlab과 비슷해 프로그래밍 경험이 제한된 사용자가 더 쉽게 액세스 할 수 있습니다.
-
상호 운용성 : C로 구조체를 생성 할 때 실제 데이터의 레이아웃은 간단하고 결정적입니다. Fortran에서 포인터 배열이나 구조화 된 데이터를 사용하는 경우 데이터의 실제 레이아웃은 직선이 아니라 컴파일러에 크게 의존합니다. Fortran에서 C를 호출하거나 그 반대로 호출 할 수 있습니다.하지만 정적 배열 이상의 것을 하나에서 다른 배열로 전달하는 것이 쉬울 수 있다고 생각하지 마십시오.
이것은 모두 다소 괴상하고 낮은 수준의 항목이지만 이것은 우리가 말하는 고성능 컴퓨팅입니다. 맞습니까? 기본 하드웨어를 가장 잘 활용하는 방법에 관심이 없다면 패러다임, 즉 공유 / 분산 메모리, 스레드, SIMD 벡터화에 가장 적합한 알고리즘 구현 및 / 또는 개발 , SIMT를 사용하는 GPU, 그런 다음 “컴퓨터에서 수학을 수행하는 것입니다.
이것은 제가 시도한 것보다 훨씬 더 오래 걸리므로 여기에 요약이 있습니다. 메시지 종류 :
- 당신 이 가장 잘 아는 언어로 당신 할 수있는 최고의 코드를 작성합니다.
- 같은 백엔드를 사용하는 두 컴파일러가 생성하는 코드의 품질에는 차이가 없습니다. 한 언어 또는 다른 언어로 잘못된 코드를 작성하는 사람은 우리 입니다.
- 더 낮은 수준의 느낌에도 불구하고 Fortran은 상당히 높은 수준의 추상화이며 특정 하드웨어 / OS 기능에 직접 액세스 할 수 없습니다. SIMD, 스레드, 네트워킹 등 …
댓글
- 좋은 응답입니다. 저는 ‘하지만 귀하의 최종 의견이 반드시 사실이라고 생각하지 않습니다. 저는 ‘ C 프로그래머이지만 좋은 프로그래밍 관행을 통해 Fortran의 저수준 항목에 액세스 할 수 있습니다. SIMD ops와 같은 것을 활용하는 이상적인 방법은 강력하게 제안하는 코드를 작성하고 (예 : 블로킹 루프 아웃) 컴파일러가 자동으로 수행하도록하는 것입니다. 스레딩의 경우 단순히 openMP를 사용하십시오 (pthread는 추가 작업에도 사용할 수 있음). Fortran은 일반적인 사용자에게 중요한 수준 인 숫자로만 언급하지 않은 ‘ 모든 항목을 제공합니다.
- @ Reid.Atcheson : 음 , 컴파일러가 그것을 잡을 수 있도록 모든 것을 차단하면 C와 Fortran 모두에서 자동으로 작동합니다. 하지만 문제는 컴파일러를 얼마나 신뢰하길 원하십니까? 그리고 당신이 원하는 일을 정확하게 알고있는 경우에 그것을 신뢰해야하는 이유는 무엇입니까? OpenMP는 스레딩을 수행하지만 블록 단위입니다. 다른 스레드 풀을 사용하여 다른 작업을 수행하도록 속일 수 있지만 이는 OpenMP를 잘못 사용하는 것입니다. Fortran의 Pthread는 C 함수의 래퍼 일뿐입니다. 그래도 Fortran이 ‘ 자세한 내용이 아니라면 더 쉽다는 데 동의합니다.
- 물론입니다. ‘ 컴파일러에 의존하여 99 %의 최대 효율을 본격적으로 얻을 수는 없지만 쉽게 접근 할 수 있습니다. 이 외에도 내장 또는 인라인 ASM을 사용해야합니다. 전체적인 프로그래머 효율성을 위해 어딘가에서 양보해야합니다. 즉, ‘이 프로그래밍 언어가 애초에 존재하는 이유입니다. 실제로 내장 또는 ASM에 대해 자세히 알아볼 수있을만큼 제정신이 아닌 단계에서 Fortran은 ‘ 목발이 아닙니다. 어쨌든 ‘ 어쨌든 조립 된 수작업으로 최적화 된 코드에서 링크하는 방법을 알고 있습니다.
- @ Reid.Atcheson : 음, 저는 ‘ d는 병렬 HPC 애플리케이션의 경우 최대 효율이 99 % 이하로 떨어질 수 있다고 주장합니다. gcc 벡터 유형은 내장 함수를 사용하는 것이 문제가되지 않도록합니다. 🙂
- @Pedro, 화려한 포스트. 정말 훌륭합니다. 게시 해 주셔서 감사합니다.흥미로운 스레드를 무작위로 뒤지면서 찾았습니다.
답변
과학 소프트웨어에 대한 15 년의 생각에서 : Fortran으로 작성했기 때문에 코드가 25 % 더 빠르게 실행되지만 작성하는 데 4 배 더 오래 걸리는 경우 (STL 없음, 복잡한 데이터 구조 구현의 어려움 등) Fortran은 당신의 하루는 엄지 손가락을 돌리고 계산이 끝날 때까지 기다리고 있습니다. 거의 모든 사람들에게 가장 가치있는 것은 우리 자신의 시간이라는 점을 감안할 때 결론은 다음과 같습니다. 다음과 같은 경우 가능한 것보다 느릴 수 있음을 무시하고 코드를 가장 빠르게 개발, 디버그 및 테스트 할 수있는 언어를 사용하십시오. Fortran에서 작성했습니다.
Answer
내 접근 방식은 일반적으로 가장 좋은 계산 커널을 제외한 모든 작업에 C ++를 사용하는 것이 었습니다. 어셈블리로 작성; 이를 통해 기존 HPC 접근 방식의 모든 성능을 확보 할 수 있지만 예를 들어 SGEMM / DGEMM / CGEMM / ZGEMM과 같은 계산 커널을 단일 루틴으로 오버로드하여 인터페이스를 단순화 할 수 있습니다. 분명히 원시 포인터를 피하고 불투명 한 클래스로 전환하여 추상화 수준을 훨씬 더 높일 수 있지만 이는 좋은 첫 번째 단계입니다.
C ++의 가장 큰 단점은 압도적으로 컴파일 시간 증가라는 것입니다. 그러나 제 경험상 개발 시간의 절약은 그것을 보충하는 것보다 더 많습니다. 또 다른 단점은 공급 업체 C ++ 컴파일러가 공급 업체 C 및 Fortran 컴파일러보다 버그가 더 많다는 것입니다. 작년에 저는 C ++ 컴파일러에서 거의 10 개의 버그를 만났다고 생각합니다.
그렇게 말하면 저수준 언어 (및 Fortran)로 작성된 과학 패키지의 실행 취소는 다음과 같다고 생각합니다. 복잡한 데이터 구조를 위해 편리한 인터페이스를 노출하는 것을 꺼림 : 대부분의 사람들은 Fortran BLAS 인터페이스에 만족합니다. 매트릭스를 설명하는 데 포인터와 선행 차원 만 필요하기 때문입니다.하지만 일반적인 40 정수 Fortran 스파 스 직접 솔버 인터페이스라고 주장하는 사람은 거의 없습니다. 편리함에 가까운 모든 것입니다 (참조 : UHM, SuperLU, PETSc 및 Trilinos).
요약하면, 저는 저수준 계산 커널에 어셈블리를 사용한다고 주장하지만, 특히 중요하지 않은 데이터 구조에서 작동 할 때 다른 모든 것에 대해서는 고수준 언어를 사용합니다.
이 점에 유의하십시오. post에서 커널 $ y : = \ alpha x + y $ 에서 C와 Fortran의 성능을 비교했습니다.
댓글
- 왜 ‘ 작은 커널을 컴파일하기 위해 적절한 최적화가 활성화 된 표준 C 컴파일러를 신뢰하지 않습니까? 그런 수준의 코드 크기와 복잡성에서 컴파일러가 가져올 수있는 것의 차이는 분명하지 않습니다.
- 적절한 제한 사용에도 불구하고 Fortran은 명시 적 행렬 전치와 같은 일부 작업의 경우 C 및 / 또는 C ++ 코드보다 여전히 빠릅니다. 저는 ‘ ‘ C 또는 C ++ 코드를 빠르게 만드는 것이 불가능하다고 말하는 것이 아닙니다.하지만 Fortran 컴파일러는 더 나은 직업입니다.
- ” restrict ” 키워드 (제 간단한 Fortran 코드는 항상 조금 더 빠름). 하지만 저의 전문 지식은 제한적이며 gcc에서 생성 된 어셈블리를 이해하는 데 투자 할 시간이 없습니다. ‘ 그래서 저는 단순히 Fortran을 사용합니다. ‘ 간단하고 ‘ 빠릅니다.
- @JackPoulson : 컴파일러 논쟁은 포트란 커뮤니티에서 꽤 많이 듣는 것입니다. 불행히도 대부분의 컴파일러는 gcc 또는 ifc / icc는 동일한 백엔드에 대해 다른 언어 프런트 엔드를 사용합니다. 최적화 및 코드 생성을 수행하는 기계는 동일하므로 결과의 차이는 아마도 프로그래머가 기본 언어에 익숙하지 않기 때문일 것입니다 …
- 약간의 관점을 제공하기 위해 Fortran이 숫자 커널에서 더 빠르다는 자주 반복되고 거의 검증되지 않은 주장에 대해 : 얼마 전에 Trilinos에서 희소 행렬-벡터 곱셈이 30 % 더 느리다는 사실을 발견했습니다. ‘ Epetra 패키지 거래하는 것보다 .II. 전자는 단순 Fortran 77로 작성되었고 후자는 ‘ restrict ‘를 사용하지 않고 단순 C로 작성되었습니다. 둘 다 약 10-15 줄의 코드가있었습니다. 오늘날 Trilinos는 deal.II에서 가져온 코드를 사용합니다. 저는 ‘ F77이 C보다 빠른 경우를 많이 찾을 수 있습니다. 요점은 ‘ 일반적으로 더 이상 그렇지 않다는 것입니다. 오늘.
답변
여기 처음 왔기 때문에 오래된 질문을 살펴보고이 질문을 찾았습니다. 오래된 질문에 대답하는 것이 금기 사항이 아니기를 바랍니다.
아무도 언급하지 않았기 때문에 그렇게 할 것이라고 생각했습니다. Fortran 2003은 대부분의 주요 컴파일러 (intel, ibm, cray, NAG, PCG)에서 거의 완벽하게 지원 합니다. 최신 릴리스 4.7. Fortran 2003 (및 2008)은 C ++보다 좀 더 장황하지만 객체 지향 언어입니다. 내가 Fortran에 대해 좋은 점 중 하나는 표준위원회가 “과학 컴퓨팅을 주요 청중”으로 본다는 사실입니다 (저는이 사실을 저에게 지적 해준 Damian Rouson에게 감사드립니다).
C ++ 프로그래머가 Fortran 프로그래머가되는 것이 아니라 Fortran 사람들이 이제 Fortran 90/95에서 C ++로 전환하거나 객체 지향 개념을 에뮬레이션하는 것 외에 더 많은 옵션이 있다는 것을 알 수 있도록합니다.
One 주의 할 점은 컴파일러에서 구현 된 것의 최첨단에있는 데 비용이 든다는 것입니다. 지금 Fortran 2003에서 주요 프로젝트를 수행하면 버그를 발견하고 계속해서 컴파일러를 업데이트해야합니다 (특히 gcc를 사용하는 경우), 지난 몇 달 동안 훨씬 나아졌습니다!
답변
C ++의 문제는 예를 들어 STL, 예외, 클래스 (가상 오버 헤드와 alignm)를 맹목적으로 사용하여 성능을 떨어 뜨릴 수있는 기회가 많습니다. ent 문제), 연산자 오버로딩 (중복 된 신규 / 삭제) 또는 템플릿 (종료되지 않는 컴파일 및 비밀 오류가 심각해 보이지만 이런 방식으로 시간을 낭비 할 수 있음).
그러나 더 많은 사람들이 일반 라이브러리에 대한 더 나은 액세스 권한을 얻고 코드의 가시성을 높일 수 있습니다 (필드에 따라 크게 다르며 여전히 순수한 C를 가지고 있음). 또한 R, Lush, Matlab / Scilab 또는 Python, Ruby 또는 Lua와 같은 스크립트 언어로 코드를 래핑하여 Fortran의 유연성 부족을 보완 할 수 있습니다.
댓글
- 일반적으로 고수준 언어에 저수준 기술을 적용하는 것은 좋지 않습니다. 예를 들어 STL은 매우 추상적 인 수준에서 작동하도록 설계되었습니다. 인터페이스가 무엇인지 알아야합니다. 이 작업에 사용하고 컴파일러에서 벗어나십시오.
- mbq ‘ s와 Martin ‘의 포인트는 불공평합니다. 예, std :: list를 사용하여 선형 대수 목적으로 숫자 형 벡터를 구현하려는 경우 발을 쏠 수있는 방법이 있습니다. < double >.하지만 ‘ 어리석은 주장입니다. 적어도 C ++에는 연결 목록 클래스가 있습니다 Fortran은 사용할 수 있지만 ‘ 사용할 수 없습니다. ‘ ” 자동차는 벽에 부딪혀 부상을 입을 수있을 정도로 빠른 속도로 운전합니다. 대신 말이 끄는 마차를 사용해야합니다. ” ‘ 낮은 수준도 지원하는 고급 언어를 폐기하는 것은 어리석은 생각입니다. 높은 수준의 기능을 갖는 수준의 항목 (예 : C ++)
- @WolfgangBangerth 아니요, 이제 Fortran을 손상시키고 있습니다. ” 저수준 ” 박테리아는 인간보다 ” 덜 진화하므로 ” . 자동차 비유를 원하면 ” Jeep과 Lexus를 모두 사용하여 늪지대를 횡단 할 수 있지만 첫 번째를 사용하면 덜 아프게됩니다. “.
- 귀하의 의견에 감사하지만 Fortran은 ‘ C ++만큼 진화하지 않았습니다. 🙂
답변
3 가지 사실 :
-
F77 스타일 n 차원 C의 배열 : CnD (분명히 뻔뻔한 플러그)를 사용하는 데 문제 없음
-
F90 “s 모듈 시스템 (예를 들어 모듈의 이름은 파일 이름과 일치 할 필요가 없습니다.)
- Fortran은 리팩토링을 잘 지원하지 않습니다. 함수의 실제 코드, 변수 선언, 인수 선언 및 인수 목록의 네 위치를 터치해야합니다. C는 두 위치를 터치해야합니다. 이로 인해 데이터를 잘 관리하지 못하는 결과가 복합적으로 나타납니다 (desc 아래 갈비뼈) : 소규모 모듈성은 매우 고통스럽기 때문에 거의 모든 사람들이 거대한 서브 루틴을 작성합니다.
한 가지 개인적인 인상 :
- 포트란은 잘 작동하지 않습니다. 데이터 관리를 위해. F77 또는 F90에서 사용자 불투명 데이터 구조에 대한 포인터를 반환 해보십시오. (
transfer()
, 여기 있습니다)
댓글
- 안드레아스 님! CnD는 흥미 롭습니다. ‘ 그에 대해 몰랐습니다. 아, 썼군요. 🙂 (f90은 또한 슬라이싱을 지원하고 배열에 할당 가능하며 가장 중요한 것은 곱셈, 더하기 등을위한 배열 구문입니다.) 저는 CMake를 Fortran과 함께 사용하며 모듈과 잘 작동합니다.” 인수 목록 “이 정확히 무엇인가요? 저는 ‘ 이것을 사용하지 않는다고 생각하므로 수정하는 데 3 곳만 필요합니다. C에서는 일반적으로 실제 코드, 매개 변수 및 헤더 파일을 수정해야하므로 ‘도 3 곳 (대부분 C ++에서)입니다. 예, transfer ()는 ‘별로 좋지는 않지만 일반적으로 ‘ 실제로 필요하지 않습니다.
- Eclipse의 Photran과 같은 적절한 IDE를 사용하면 최신 포트란을 리팩토링하는 것은 간단합니다.
- ” 모듈 ‘의 이름 ‘ 파일 이름과 일치 할 필요는 없습니다. 예 : ” 농담이되어야합니다. 하나의 파일에 여러 모듈을 포함 할 수 있습니다. 그들 중 일부는 단지 몇 줄에 걸쳐 있습니다. 각각에 대해 파일을 만들 필요가 없으면 훨씬 쉽게 만들 수 있습니다.
- @ user389가 말한 내용에 추가하고 싶었지만 Photran은 훌륭하고이를 허용하는 유일한 Fortran IDE입니다. 리팩토링, 파서는 항상 실패합니다. 반면에, Eclipse가 메모리를 많이 사용한다는 사실에 대해 ‘ 언급 할 필요가 없습니다.
답변
Fortran은 어레이 / 매트릭스 계산에 최적화되어 있으며 모든 유형의 텍스트 구문 분석에 대해 작업하기가 매우 어렵습니다. C 및 C ++는 수치 컴퓨팅에서 Fortran과 일치하지 않을 수 있지만 (가까운) C / C ++를 사용하면 텍스트를 처리하고 데이터 (예 : 사용자 지정 데이터 구조)를 구성하는 것이 훨씬 더 쉽습니다.
As 다른 사람들이 언급했듯이 동적 해석 언어를 계산하지 마십시오 (Python et al). Fortan의 얼굴 녹는 속도를 제공하지 않을 수도 있지만 구현의 모든 세부 사항보다 계산 문제를 해결하는 데 더 집중할 수 있습니다. 종종 Python으로 솔루션을 구현할 수 있으며 성능이 허용되지 않는 경우 일부 프로파일 링을 수행하고 문제 영역을 식별하고 Cython을 사용하여 해당 코드를 최적화하거나 컴파일 된 언어로 전체 프로그램을 다시 구현합니다. 문제 해결 논리를 구체화하면 나머지는 구현 일 뿐이며 컴퓨팅 기본 사항을 잘 이해하면 다양한 프로그래밍 언어로 간단하게 표현할 수 있습니다.
댓글
- 그 ‘ 맞습니다. 텍스트 파싱을 위해 Python도 사용합니다.
- 예를 들어 컴파일 된 언어로 Python 스크립트의 일부를 구현할 수도 있습니다. C ++로 연결하고 연결합니다. Boost Python, Swig 등
Answer
현재 국립 연구소 중 하나에서 일하고 있습니다. 대부분 제 주변의 사람들 중에는 기계 엔지니어가 있습니다. HPC 그룹의 일부 사람들과 대화를 나누면서 그들은 대부분 Linux와 대부분 C ++를 사용하고 있습니다. 현재 내가 속한 그룹은 대부분 데스크톱 애플리케이션을 수행하며 Windows를 사용하며 내림차순으로 C #, FORTRAN, Python, VBA 및 VB (.NET이 아닌 6)를 사용합니다. 일부 시뮬레이션 엔진 은 FORTRAN의 다른 국립 연구소에서 작성되었습니다.
답변
검색해 주셔서 죄송합니다. 오래된 스레드이지만 2015 년에도 Fortran이 많이 사용되는 것 같습니다.
방금 이 를 발견했습니다 (대체 link ) 목록은 기본적으로 DOE의 OCLF 시설에서 승인 한 13 개의 코드 목록으로 300-petaFLOPS Summit 기계에서 실행되며 2018 년에 연구자들에게 제공 될 예정입니다. . 코드에 사용 된 기본 언어 (빠른 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 개 중 Fortran에서 최소한 10 개의 코드 (빠른 검색 기준)가 작성된 것으로 보입니다. 50 년 된 언어로는 나쁘지 않습니다.
참고 : 언어 비교는 쓸모가 없다는 것을 잘 알고 있지만 포트란이 나쁜 입을 다물고있는 사람들 (특히 C ++ 사용자)의 수를 감안할 때 언급 할 가치가 있다고 생각했습니다.
댓글
- 국립 연구소에서의 제 경험이 그 반대 였기 때문에 동의하지 않습니다. 내가 Lawrence Livermore에서 보는 대부분의 새로운 프로젝트는 C ++로 작성되었으며 ODE 솔버, FEM 이산화 및 범용 과학 컴퓨팅 라이브러리의 새로운 (또는 적극적으로 유지 관리되는) 최신 오픈 소스 라이브러리의 대부분은 C 또는 C ++에있는 것 같습니다. Fortran은 주로 기존 / 레거시 라이브러리를 사용하는 프로젝트에서 사용되는 것 같습니다. ‘ 언어에 대해 생각하는 것과는 별개로 Fortran을 사용하는 크고 새로운 프로젝트가 많지 않습니다.
- 일부 밀도 함수 이론 코드도 작성되었습니다. Fortran에는 VASP 및 CASTEP 가 포함되지만 @GeoffOxberry가 지적했듯이 new 프로젝트는 아마도 C ++를 선호하는 경향이 있습니다.
- @blochwave 링크에서 읽을 수 있듯이 프로젝트는 2018 년에 온라인으로 제공 될 새로운 머신 (가속기 등 포함)을위한 것입니다.따라서 그들은 좋은 성능으로 실행되기를 바라면서 25 년의 코드를 가지고 컴파일하는 것과는 다릅니다. 위 목록에있는 코드의 상당 부분이 새 코드에서와 같이 다시 작성되었거나 다시 작성되었다고 확신합니다. 많은 ” 새로운 ” 기후 코드가 Fortran에도 있으며 여러 국가의 많은 기관에서 사용합니다.
답변
Jack P. 제 생각에는 믹스 앤 매치를해야한다는 것입니다. 좋은 소프트웨어는 신중하게 계층화됩니다. 다른 레이어는보다 자연 스럽거나 효율적으로 다른 언어로 매핑 될 수 있습니다. 각 레이어에 가장 적합한 언어를 선택해야합니다. 또한 언어가 상호 운용되는 방식을 이해해야하며 이는 어떤 계층에 대해 선택한 언어에 영향을 미칠 수 있습니다.
더 좋은 질문은 계층화 된 소프트웨어를 설계하는 방법에 대해 배우기 위해 연구 할 가치가있는 훌륭하게 설계된 소프트웨어의 예가 무엇인지입니다.