포트란을 빨리 만드는 이유는 무엇입니까?


41

포트란은 수치 프로그래밍에서 특별한 위치를 차지하고 있습니다. 확실히 다른 언어로 빠르고 좋은 소프트웨어를 만들 수는 있지만, 포트란은 그 나이에도 불구하고 계속 잘 수행합니다. 또한 포트란에서 빠른 프로그램을 만드는 것이 더 쉽습니다. C ++로 빠른 프로그램을 만들었지 만 포인터 앨리어싱과 같은 것에 더주의해야합니다. 따라서 이에 대한 이유와 매우 기술적 인 이유가 있어야합니다. 컴파일러가 더 최적화 할 수 있기 때문입니까? 기술적 인 세부 사항을 알고 싶습니다. 다른 언어를 사용하는 경우 이러한 사항을 고려할 수 있습니다.

예를 들어, 나는 표준이 포인터가 메모리에서 연속적임을 지정하여 메모리 액세스 속도가 빠르다는 것을 알고 있다고 생각합니다. 컴파일러에 플래그를 지정하여 C ++ 에서이 작업을 수행 할 수 있다고 생각합니다. 이런 식으로 Fortran의 장점을 파악하는 데 도움이되므로 다른 언어를 사용하는 경우이를 모방 할 수 있습니다.


7
나는 이것이 좋은 질문이지만 스택 오버 플로우에 대한 더 좋은 질문 일 것이라고 말하고 싶습니다. 빠른 검색 ( stackoverflow.com/search?q=fortran+fast )을 통해 다음 질문에 도움이 될 것입니다. stackoverflow.com/questions/146159/is-fortran-faster-than-c
— Yann

3
사용중인 포트란 유형을 지정해야합니다. 77과 90+ 사이에는 상당한 차이가 있습니다. 우리가 포인터에 대해 이야기한다면 적어도 90을 가정하고 있습니다 ...
— qubyte

나는 항상 포트란이 C보다 빠르다는 것에 대해 읽었습니다. 아마도 2 %보다 빠르거나 50 %와 같이 빠릅니다.
— shuhalo

4
도시 신화입니다. 컴파일러가 특수 명령어를 사용할 수 없으면 컴파일러와 상관없이 거의 모든 프로그램을 수동으로 최적화하여 거의 동일한 기계 언어를 생성 할 수 있습니다.
— Mike Dunlavey 2016 년

답변:


50

언어 디자이너는 많은 선택에 직면 해 있습니다. Ken Kennedy 는 (1) 더 나은 추상화와 (2) 더 높거나 낮은 수준의 (보다 적거나 더 많은 머신과 유사한) 코드를 강조했습니다. Haskell 및 Scheme과 같은 기능적 언어는 전자에 중점을 두지 만 Fortran 및 C / C ++와 같은 전통적인 과학 컴퓨팅 언어는 후자에 중점을 둡니다. 한 언어가 다른 언어보다 빠르다는 것은 일반적으로 오해의 소지가 있습니다. 각 언어에는 문제가있는 도메인이 있습니다. 포트란은 배열 모델과 명시 성이라는 두 가지 기본 이유로 배열 기반 숫자 코드 영역에서 다른 언어보다 더 우수합니다.

배열 모델

포트란 프로그래머는 대부분 배열 조작을합니다. 이를 위해 Fortran은 다른 언어로는 사용할 수없는 여러 컴파일러 최적화를 지원합니다. 가장 좋은 예는 벡터화입니다. 데이터 레이아웃을 알면 컴파일러가 배열에서 어셈블리 수준 내장 함수를 호출 할 수 있습니다.

언어의 명백 함

단순한 언어가 복잡한 언어보다 "더 나은"컴파일을해야하는 것처럼 보이지만 실제로는 그렇지 않습니다. 어셈블리 언어로 작성할 때 컴파일러가 할 수있는 일은 많지 않습니다. 모든 것은 매우 세밀한 명령어입니다. Fortran은 어레이 기반 컴퓨팅에 실질적인 보상을 제공하는 경우에만 명시 성 (따라서 프로그래머가 더 많은 작업)을 요구합니다. Fortran은 간단한 데이터 유형, 기본 제어 흐름 및 제한된 네임 스페이스를 사용합니다. 반대로 컴퓨터는 레지스터를로드하는 방법을 알려주지 않습니다 ( 실시간에 필요할 수 있음 ). Fortran 이 명백한 경우 초보자를 시작하는 데 도움이되는 완전한 형식 유추와 같은 기능을 사용할 수 있습니다. 또한 종종 C를 느리게 만드는 것을 피합니다.불투명 포인터 .

포트란은 느려질 수있다

Fortran은 모든 작업에 빠르지 는 않습니다 . 그래서 많은 사람들이 GUI를 구축하거나 고도로 구조화되지 않은 과학 컴퓨팅에 그것을 사용하지 않는 것입니다. 그래프, 의사 결정 트리 및 기타 영역에 대한 배열 세계를 떠나면이 속도 이점이 빠르게 사라집니다. 몇 가지 예와 숫자 는 컴퓨터 언어 벤치 마크 를 참조하십시오 .


7
"일반적인"언어로 포트란 크런치를 래핑하여 GUI / IO 문제를 쉽게 해결할 수 있습니다. 이 목적을 위해 종종 R을 사용합니다.
— mbq

2
shootout.alioth.debian.org 를 더 이상 사용할 수 없습니다! 그리고 새 버전은 정보가 훨씬 적습니다 :(
— astrojuanlu

23

Fortran의 설계는 컴파일러가 C에서 일반적으로 사용할 수없는 최적화 인 경우에 따라 더 강력한 최적화를 수행 할 수 있도록합니다.

유명한 예로는 앨리어싱 처리가 있습니다. Fortran에서는 해당 메모리 영역과 관련된 특정 기호를 통해서만 특정 메모리 영역에 액세스 할 수 있습니다. 이 지식을 통해 컴파일러는 캐시해야 할 때 스마트 트릭을 사용할 수 있습니다. 값이 잠재적으로 변경되었는지 여부를 알고 있습니다. F90까지는 쉽게 확인되었습니다. Fortran 90이 도입되었을 때 pointers가정은 더 이상 사실이 아니 었습니다. 두 개 이상의 심볼을 통해 동일한 메모리 영역에 액세스 할 수 있습니다. 이것이 target포인터를 통해 주소를 지정할 배열 을 지정 해야하는 이유 입니다.

또 다른 흥미로운 사실은 많은 구성을 통해 컴파일러가 사용자 개입없이 병렬화를 수행 할 수 있다는 것입니다. 이러한 고급 스러움은 언어로서 포트란의 상대적 "플랫폼 불가지론"으로 ​​인해 가능합니다.

이와 같은 많은 미묘한 트릭이 있습니다. 또한 수치 계산을 제외하고 오늘날 아무도 포트란을 사용하지 않는다는 점을 기억하십시오. 이는 포트란 컴파일러의 핵심 기능 및 판매 지점이 결과 코드 속도라는 것을 의미합니다. 결과적으로 벤더는 이에 초점을 맞췄습니다.

그럼에도 불구하고 다른 언어로도 성능 코드를 생성 할 수 있습니다. 그러나 특별한 보살핌이나 인간의 개입이 필요할 수 있습니다. 그러나 일반적으로 문제는 문제가 발생하기 전까지는 성능에 문제가 없으며 컴퓨터 사용 시간보다 작업 시간이 더 비싸다는 것입니다. 따라서 코딩 관행은 컴퓨터 시간이 아닌 사람의 시간을 절약하는 데 중점을 두어야합니다.


2
컴퓨터가 1 억 달러가 넘는 범위에 들어가면 사람들의 시간 (학년생)은 그다지 비싸지 않습니다.
— Phil Miller

6
@Novelocrat :에서 실행되는 코드의 양은 $ (100) 수백만의 컴퓨터가 잘 넘어 가서 셀 수없는 사람이 시간에 의해 작성되었습니다 $ 심지어 대학원생 가격에, 100,000,000마르크. 사람의 비용은 소득의 두 배라는 것을 기억하십시오. 나머지는 세금과 관련이 있습니다. 또한 컴퓨터에서 화상이 발생하지 않습니다. 사람이하고 일을 바꿉니다.
— 스테파노 보리 니

1
@StefanoBorini 화상을 경험 한 PC의 오랜 역사를 가지고 있습니다.
— N74

1
"또한 숫자 계산을 제외하고 오늘날 아무도 포트란을 사용하지 않는다는 점을 기억하십시오"Fortran = "FORmula TRANslation". 포트란은 항상 주로 수치 계산을 위해 사용 및 설계되었습니다. Fortran은 고성능 컴퓨터 시간의 상당 부분을 차지합니다.
— user21387

오늘날뿐만 아니라 항상, 포트란은 숫자 계산과 같은 모든 목적으로 사용됩니다.
— 시퀀스

12

나는 Fortran이 금속에 가깝다고 생각하지 않지만 (다른 답변 참조) 매우 쉽게 최적화되는 경향이 있습니다. 루프는 간단하고 언어는 벡터화 확장을 쉽게 지원합니다 (첫 번째 작업에서 사용했을 때 광범위한 벡터 철분을 목표로했습니다).

큰 관성 요인도 있습니다. 많은 숫자 코드가 Fortran에 있으므로 고급 서버 및 수퍼 컴퓨터의 빌더는 최적화 된 Fortran 컴파일러를 작성합니다. 컴파일러는 우수하지만 (고품질 컴파일러가 상대적으로 부족한 시스템에서도) 사용자는 계속 포트란을 사용하고 새로운 코드를 작성합니다. 따라서 빌더는 차세대에 우수한 컴파일러 등이 있는지 확인합니다.


8

도시 신화에주의하십시오. 두 개의 컴파일러가 동일한 어셈블리 코드를 생성하면 결과 프로그램의 성능이 동일합니다.

주어진 논리에 대해 실행 시간을 최소화하는 어셈블리 언어의 프로그램이 있습니다. 이 프로그램은 어떤 컴파일러가 생성했는지는 신경 쓰지 않습니다.

즉, 프로그래머가 쉽게 생활 할 수 있도록 컴파일 된 언어가 있습니다. 이 비용의 일부는 실행 시간을 최소화하지 않는 기능을 사용하도록 사용자를 유혹 할 수 있다는 것입니다. 이것의 주요 예는 newC ++입니다. (얼마나 느릴 수 있습니까-단지 3 자입니까?) 실제로 메모리를 동적으로 할당하고 런타임 비용에주의를 기울이지 않기를 간청합니다. 그것이 당신이하고 싶은 일이라면 대단하지만, Fortran은 당신을 그렇게 빠뜨리지 않았기 때문에 더 빠를 수 있습니다.

그러나 그 너머로, 처음 작성된대로 컴파일러가 결코 당신을 위해 청소 할 수없는 종류의 성능 향상을위한 큰 여지 가없는 프로그램을 본 적이 없습니다 . 일례로서, 동일한 인수를 사용하여 호출 exp및 / 또는 log반복적으로 많은 시간을 소비한다 . 또 다른 예로서, 행렬을 곱하기 위해 DGEMM을 호출하고 시간의 큰 부분이 입력 문자 인수를 해독하기 위해 LSAME를 호출하는 데 소요됩니다.

이것은 사람들이 포인터 앨리어싱이나 루프 언 롤링 때문에 포트란이 더 빠르다고 말하는 것과 동시에입니다. 그것은 포르쉐가 만든 버스가 시보레가 만든 버스보다 확실히 빠르다는 말과 같습니다. 약간의 상식이 필요합니다.


4
나는 단지 도시 신화라고 생각하지 않습니다. 전체 배열 연산, PURE / ELEMENTAL 함수 등을위한 포트란의 지원은 컴파일러가 쉽게 최적화 / 벡터화 또는 병렬화 할 수 있도록 도와줍니다. 예를 들어, thinkingparallel.com/2007/08/14/…를 참조하십시오 . 컴파일러가 실제로하는 일은 다른 이야기입니다 (공급 업체에 따라 다름).
— stali

@stali : 공급 업체 이상에 의존합니다. 컴파일되는 프로그램에 따라 다릅니다. 나는 사람들이 "Fortran이 빠르게 실행할 수있는 프로그램이있다"에서 "Fortran이 어떤 프로그램에서든 빠르다"라는 일반화를 보았다. 이 점을 지적하면 사람들은 머리카락을 자르고 깎아 내고 머리카락을 나눌 수 있으며 결국 머리카락이 실제로 내려 오는 것은 사람들이 생각하고 싶은 것 이상입니다.
— 마이크 던
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.