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


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.