문제

때때로 나는 무거운 계산에서 Fortran이 C보다 빠르거나 더 빠를 수 있다는 것을 읽었습니다.그게 정말 사실인가요?나는 Fortran을 거의 모른다는 것을 인정해야 하지만, 지금까지 내가 본 Fortran 코드는 C에 없는 기능이 언어에 있다는 것을 보여주지 못했습니다.

사실이라면 그 이유를 알려주세요.숫자 처리에 어떤 언어나 라이브러리가 좋은지 말하지 마세요. 저는 그렇게 하기 위한 앱이나 라이브러리를 작성할 생각이 없으며 단지 궁금할 뿐입니다.

도움이 되었습니까?

해결책

언어에는 비슷한 기능이 있습니다. 성능 차이는 Fortran이 동등한 명령문을 사용하지 않는 한 Aliasing이 허용되지 않는다는 사실과 관련이 있습니다. 별명이있는 모든 코드는 유효한 Fortran이 아니지만 프로그래머에게 달려 있으며 이러한 오류를 감지하는 것은 컴파일러가 아닙니다. 따라서 Fortran 컴파일러는 메모리 포인터의 가능한 별칭을 무시하고보다 효율적인 코드를 생성 할 수 있습니다. C 에서이 작은 예를 살펴보십시오.

void transform (float *output, float const * input, float const * matrix, int *n)
{
    int i;
    for (i=0; i<*n; i++)
    {
        float x = input[i*2+0];
        float y = input[i*2+1];
        output[i*2+0] = matrix[0] * x + matrix[1] * y;
        output[i*2+1] = matrix[2] * x + matrix[3] * y;
    }
}

이 기능은 최적화 후 Fortran 대응 물보다 느리게 실행됩니다. 왜 그렇게? 출력 배열에 값을 쓰면 행렬 값을 변경할 수 있습니다. 결국, 포인터는 겹치고 같은 메모리 덩어리를 가리킬 수 있습니다 ( int 바늘!). C 컴파일러는 모든 계산에 대해 메모리에서 4 개의 행렬 값을 다시로드해야합니다.

Fortran에서 컴파일러는 행렬 값을 한 번로드하여 레지스터에 저장할 수 있습니다. Fortran 컴파일러가 포인터/어레이가 메모리에서 겹치지 않는다고 가정하기 때문에 그렇게 할 수 있습니다.

다행히도 restrict 이 문제를 해결하기 위해 키워드와 엄격한 알리 아스가 C99 표준에 도입되었습니다. 요즘 대부분의 C ++ 컴파일러에서도 잘 지원됩니다. 키워드를 사용하면 컴파일러에게 프로그래머가 포인터가 다른 포인터와 별명을하지 않는다고 약속한다는 힌트를 제공 할 수 있습니다. 엄격한 알리 아스는 프로그래머가 다른 유형의 포인터가 겹치지 않을 것을 약속한다는 것을 의미합니다. double* 겹치지 않습니다 int* (특정 예외가 있습니다 char* 그리고 void* 무엇이든 겹칠 수 있습니다).

사용하면 C와 Fortran에서 동일한 속도를 얻게됩니다. 그러나 사용 능력 restrict 성능 중요한 기능을 갖춘 키워드는 C (및 C ++) 프로그램이 훨씬 안전하고 쓰기가 더 쉽다는 것을 의미합니다. 예를 들어, 유효하지 않은 Fortran 코드를 고려하십시오. CALL TRANSFORM(A(1, 30), A(2, 31), A(3, 32), 30), 대부분의 FORTRAN 컴파일러는 경고없이 행복하게 컴파일하지만 일부 컴파일러, 일부 하드웨어 및 일부 최적화 옵션에만 나타나는 버그를 소개합니다.

다른 팁

예, 1980 년에; 2008 년에? 의존합니다

전문적으로 프로그래밍을 시작했을 때 Fortran의 속도 지배력은 단지 도전을 받고있었습니다. 나는 기억해 Dr. Dobbs에서 그것에 대해 읽었습니다 그리고 나이가 많은 프로그래머들에게 기사에 대해 이야기했습니다.

그래서 나는 이것에 대한 두 가지 견해, 이론적이고 실용적입니다. 이론에 의하면 Fortran Today는 C/C ++ 또는 조립 코드를 허용하는 언어에 대한 본질적인 이점이 없습니다. 실제로 Fortran Today는 여전히 수치 코드의 최적화를 중심으로 한 역사와 문화의 유산의 이점을 누리고 있습니다.

Fortran 77까지, 언어 설계 고려 사항은 주요 초점으로 최적화를 가졌습니다. 컴파일러 이론 및 기술 상태로 인해 이것은 종종 제한 기능 및 기능 컴파일러에 코드 최적화에 가장 적합한 샷을 제공합니다. 좋은 비유는 Fortran 77을 속도를 위해 특징을 희생하는 전문 경주 용 자동차로 생각하는 것입니다. 요즘 컴파일러는 모든 언어에서 더 나아졌으며 프로그래머 생산성을위한 기능이 더 가치가 있습니다. 그러나 여전히 사람들이 과학 컴퓨팅의 속도에 관심이있는 곳이 여전히 있습니다. 이 사람들은 아마도 포트란 프로그래머 인 사람들로부터 코드, 훈련 및 문화를 물려 받았을 가능성이 높습니다.

코드 최적화에 대해 이야기하기 시작하면 많은 문제가 있으며 이것에 대한 느낌을 얻는 가장 좋은 방법은 사람들이 자신의 직업이있는 곳에 숨어있는 것은 빠른 수치 코드를 갖는 것입니다.. 그러나 이러한 비판적으로 민감한 코드는 일반적으로 전체 코드 라인의 작은 부분이며 매우 전문화됩니다. 많은 Fortran 코드는 다른 언어의 다른 많은 코드와 마찬가지로 "비효율적"과 마찬가지로 "비효율적입니다. 최적화는 그러한 코드의 주요 관심사가되어서는 안됩니다..

Fortran의 역사와 문화에 대해 배우기 시작하기에 멋진 장소는 Wikipedia입니다. Fortran Wikipedia 항목 훌륭하고 저는 포트란 커뮤니티의 가치를 높이기 위해 시간과 노력을 기울인 사람들에게 대단히 감사합니다.

(이 답변의 단축 버전은 우수한 스레드에서 주석이었을 것입니다. 닐스 그러나 나는 그렇게 할 업장이 없습니다. 사실, 나는 아마도 아무것도 쓰지 않았을 것입니다.이 스레드는 불꽃 전쟁과 언어 편견과 달리 실제 정보 내용과 공유를 위해이 주제에 대한 나의 주요 경험입니다. 나는 압도 당하고 사랑을 나누어야했다.)

Fortran은 어느 정도 컴파일러 최적화를 염두에두고 설계되었습니다. 이 언어는 컴파일러가 병렬 처리 (특히 멀티 코어 프로세서에서)를 이용할 수있는 전체 배열 작업을 지원합니다. 예를 들어,

조밀 한 매트릭스 곱셈은 간단합니다.

matmul(a,b)

벡터 X의 L2 표준은 다음과 같습니다.

sqrt(sum(x**2))

또한 다음과 같은 진술 FORALL, PURE & ELEMENTAL 절차 등. 코드를 최적화하는 데 도움이됩니다. 이 간단한 이유 때문에 Fortran의 포인터조차도 C만큼 유연하지 않습니다.

다가오는 Fortran Standard (2008)에는 병렬 코드를 쉽게 쓸 수있는 공동 배열이 있습니다. G95 (오픈 소스) 및 Cray의 컴파일러는 이미 지원합니다.

따라서 컴파일러가 C/C ++보다 최적화/병렬화 할 수 있기 때문에 예 Fortran은 빠를 수 있습니다. 그러나 인생의 다른 모든 것들과 마찬가지로 좋은 컴파일러와 나쁜 컴파일러가 있습니다.

여기에 언어를 모르기 때문에 많은 답변이 있다는 것은 재밌습니다.이는 특히 이전 FORTRAN 77 코드를 열어서 약점을 논의하는 C/C++ 프로그래머에게 해당됩니다.

속도 문제는 대부분 C/C++와 Fortran 사이의 문제라고 생각합니다.거대한 코드에서는 항상 프로그래머에 따라 다릅니다.Fortran이 능가하는 언어의 일부 기능과 C가 수행하는 일부 기능이 있습니다.따라서 2011년에는 어느 것이 더 빠른지 실제로 누구도 말할 수 없습니다.

언어 자체에 대해 Fortran은 현재 전체 OOP 기능을 지원하며 이전 버전과 완전히 호환됩니다.나는 Fortran 2003을 철저하게 사용해왔고 그것을 사용하는 것이 정말 즐거웠다고 말하고 싶습니다.어떤 측면에서 Fortran 2003은 여전히 ​​C++보다 뒤떨어져 있지만 사용법을 살펴보겠습니다.Fortran은 주로 수치 계산에 사용되며 속도상의 이유로 멋진 C++ OOP 기능을 사용하는 사람은 없습니다.고성능 컴퓨팅에서 C++는 갈 곳이 거의 없습니다(MPI 표준을 살펴보면 C++가 더 이상 사용되지 않음을 알 수 있습니다!).

요즘에는 Fortran과 C/C++를 사용하여 혼합 언어 프로그래밍을 간단하게 수행할 수 있습니다.Fortran에는 GTK+용 인터페이스도 있습니다.무료 컴파일러(gfortran, g95)와 뛰어난 상용 컴파일러가 많이 있습니다.

Fortran이 더 빠른 데에는 몇 가지 이유가 있습니다.그러나 그들이 중요한 금액은 너무 중요하지 않거나 어쨌든 해결될 수 있으므로 중요하지 않습니다.요즘 Fortran을 사용하는 주된 이유는 레거시 응용 프로그램을 유지 관리하거나 확장하는 것입니다.

  • 함수에 대한 PURE 및 ELEMENTAL 키워드.부작용이 없는 기능입니다.이를 통해 컴파일러가 동일한 함수가 동일한 값으로 호출된다는 것을 알고 있는 특정 경우에 최적화가 가능합니다. 메모:GCC는 언어 확장으로 "순수"를 구현합니다.다른 컴파일러도 그럴 수 있습니다.모듈 간 분석도 이러한 최적화를 수행할 수 있지만 어렵습니다.

  • 개별 요소가 아닌 배열을 처리하는 표준 함수 세트입니다.sin(), log(), sqrt()와 같은 것들은 스칼라 대신 배열을 사용합니다.이렇게 하면 루틴을 최적화하는 것이 더 쉬워집니다. 자동 벡터화는 이러한 함수가 인라인이거나 내장된 경우 대부분의 경우 동일한 이점을 제공합니다.

  • 내장 복합 유형.이론적으로 이는 컴파일러가 특정 경우에 특정 명령을 재정렬하거나 제거할 수 있도록 허용할 수 있지만 struct { double re, im;};C에서 사용되는 관용어운영자가 포트란에서 복잡한 유형을 작업할 때 개발 속도가 빨라집니다.

Fortran을 선호하는 핵심 요점은 벡터 및 배열 기반 수학을 표현하는 데 약간 더 적합한 언어라는 것입니다. 휴대용 코드는 실제로 컴파일러에게 무언가를 말할 수 있다고 가정 할 수 없기 때문에 위에서 지적한 포인터 분석 문제는 실제로 실제입니다. 도메인의 모습에 더 가까운 방식으로 표현 컴퓨터에 항상 이점이 있습니다. C에는 실제로 배열이 전혀 없으며, 자세히 보면 그런 종류의 행동 만하면됩니다. Fortran에는 진짜 Arrawys가 있습니다. 이는 특정 유형의 알고리즘에 특히 병렬 기계에 대해 쉽게 컴파일 할 수 있습니다.

런타임 시스템 및 전화 컨벤션과 같은 것들에 깊이 빠져 나가는 C 및 Modern Fortran은 무엇이 차이가 될지보기가 어렵다는 것만으로도 충분히 유사합니다. C : C : C ++는 성능 특성이 매우 다른 완전히 다른 문제입니다.

한 언어가 다른 언어보다 빠른 것과 같은 것은 없으므로 적절한 대답은 아니요.

실제로 물어봐야 할 것은 "C 컴파일러 y로 컴파일 된 동등한 코드보다 Fortran Compiler X가 더 빠른 코드가 컴파일 된 것"입니다. 물론 그 질문에 대한 답은 어떤 두 컴파일러를 선택하는지에 따라 다릅니다.

또 다른 질문은 "컴파일러에서 최적화하는 동일한 양의 노력이 주어지면 어떤 컴파일러가 더 빠른 코드를 생성 할 것인가?" 이것에 대한 대답은 사실입니다 포트란. Fortran 컴파일러에는 Certian 이점이 있습니다.

  • Fortran은 컴파일러를 사용하지 않겠다고 맹세 한 날에 어셈블리와 경쟁해야했기 때문에 속도를 위해 설계되었습니다. C는 유연하게 설계되었습니다.
  • Fortran의 틈새 시장은 숫자 위기였습니다. 이 도메인 코드에서는 다음과 같습니다 절대 충분히 빠릅니다. 따라서 언어를 효율적으로 유지해야한다는 압력이 항상 많았습니다.
  • 컴파일러 최적화에 대한 대부분의 연구는 Fortran 번호 크런치 코드 속도를 높이는 데 관심이있는 사람들에 의해 수행되므로 Fortran 코드 최적화는 다른 컴파일 된 언어를 최적화하는 것보다 훨씬 더 잘 알려진 문제이며 새로운 혁신은 Fortran 컴파일러에 먼저 나타납니다.
  • BIGGIE: C는 Fortran보다 훨씬 더 많은 포인터 사용을 장려합니다. 이는 C 프로그램의 모든 데이터 항목의 잠재적 범위를 급격히 증가시켜 최적화하기가 훨씬 어렵습니다. ADA는이 영역에서 C보다 훨씬 우수하며 일반적으로 발견되는 Fortran77보다 훨씬 현대적인 OO 언어입니다. C보다 빠른 코드를 생성 할 수있는 oolangauge를 원한다면 이것은 귀하에게 도움이됩니다.
  • 숫자가 크기가 높은 틈새 시장으로 인해 Fortran 컴파일러 고객은 C 컴파일러 고객보다 최적화에 더 많은 관심을 갖는 경향이 있습니다.

그러나 누군가가 C 컴파일러의 최적화에 많은 노력을 기울이지 않고 플랫폼의 Fortran 컴파일러보다 더 나은 코드를 생성하게하는 것은 없습니다. 실제로 C 컴파일러가 생성 한 판매량이 커지면이 시나리오가 상당히 가능해집니다.

Fortran이 C와 다른 다른 항목이 있고 잠재적으로 더 빠릅니다. Fortran은 C보다 더 나은 최적화 규칙을 가지고 있습니다. Fortran에서는 표현식의 평가 순서가 정의되지 않으므로 컴파일러가이를 최적화 할 수 있습니다. 특정 순서를 강제하려면 괄호를 사용해야합니다. C에서는 순서가 훨씬 엄격하지만 "-fast"옵션을 사용하면 더 편안하며 "(...)"도 무시됩니다. Fortran은 중간에 멋지게 거주하는 방법이 있다고 생각합니다. (글쎄, IEEE는 특정 평가 주문 변화가 오버플로 발생하지 않아야하므로 라이브를 더 어렵게 만듭니다. 이는 무시하거나 평가를 방해해야합니다).

더 똑똑한 규칙의 또 다른 영역은 복소수입니다. C 99까지 C 99까지 걸렸을뿐만 아니라 규칙은 Fortran에서 더 나은 규칙입니다. Gfortran의 Fortran 라이브러리는 부분적으로 C로 작성되었지만 Fortran 시맨틱을 구현하기 때문에 GCC는 옵션을 얻었습니다 ( "일반"C 프로그램과 함께 사용할 수 있음).

-FCX-Fortran-Rules 복잡한 곱셈 및 분할은 Fortran 규칙을 따릅니다. 범위 감소는 복잡한 분할의 일부로 수행되지만, 복잡한 곱셈 또는 분할의 결과가 "NAN + I*NAN"인지 여부를 확인하지 않으며,이 경우 상황을 구출하려는 시도가 있습니다.

위에서 언급 한 별명 규칙은 또 다른 보너스이며, 원칙적으로 - 전체 배열 작업은 컴파일러의 최적화에 의해 제대로 고려되면 더 빠른 코드를 이끌 수 있습니다. 콘트라 측면에는 특정 작업이 더 많은 시간이 걸린다는 것과 같습니다. 예를 들어, 할당 가능한 배열에 할당된다면 많은 수표가 필요합니다 (Realloce? [Fortran 2003 기능], 배열 보폭 등이 있습니다). 간단한 운영은 무대 뒤에서 더 복잡하여 느리게하지만 언어를 더욱 강력하게 만듭니다. 반면에, 유연한 경계와 보폭을 가진 배열 작업을 통해 코드를 쉽게 작성할 수 있으며 컴파일러는 일반적으로 사용자보다 코드를 최적화하는 것이 좋습니다.

전체적으로 C와 Fortran은 거의 똑같이 빠르다고 생각합니다. 선택은 어떤 언어가 더 좋아하는 언어 또는 Fortran의 전체 배열 작업을 사용하는지 여부와 더 나은 이식성이 더 유용하거나 C의 시스템 및 그래픽 사용자 인터페이스 라이브러리에 대한 더 나은 인터페이스가 더 유용합니다.

에 대해서는 아무것도 없습니다 언어 Fortran과 C는 특정 목적을 위해 다른 하나보다 빠르게 만듭니다. 구체적인 것에 관한 것들이 있습니다 컴파일러 특정 작업에 대해 다른 작업에 더 유리한이 언어에 대해 다른 각 언어에 대해.

수년 동안 Fortran 컴파일러가 존재하여 숫자 루틴에 흑 마법을 수행 할 수 있었기 때문에 많은 중요한 계산이 미친 듯이 빠릅니다. 현대 C 컴파일러도 할 수 없었습니다. 결과적으로, 많은 훌륭한 코드 라이브러리가 Fortran에서 성장했습니다. 이 잘 테스트되고 성숙하고 멋진 라이브러리를 사용하려면 Fortran 컴파일러를 세웁니다.

저의 비공식적 인 관찰에 따르면 요즘 사람들은 무거운 계산 내용을 모든 오래된 언어로 코딩하고 시간이 걸리면 저렴한 컴퓨팅 클러스터에서 시간을 찾습니다. 무어의 법칙은 우리 모두를 바보로 만듭니다.

Fortran, C 및 C ++의 속도를 Netlib의 클래식 Levine-Callahan-Dongarra 벤치 마크와 비교합니다. OpenMP와 함께 여러 언어 버전은입니다http://sites.google.com/site/tprincesite/levine-callahan-dongarra-vectorsC는 자동 변환으로 시작하여 특정 컴파일러에 대한 제한 및 pragmas 삽입으로 시작되면서 C는 추악합니다. C ++는 해당되는 경우 STL 템플릿이있는 C입니다. 내 생각에, STL은 유지 보수 가능성을 향상시키는 지에 대한 혼합 백입니다.

예제는 라이닝에 대한 의존이 거의없는 전통적인 포트 란 실습을 기반으로하기 때문에 최적화가 어느 정도 최적화를 개선하는지를 확인하기위한 자동 기능을 최소화하는 것은 최소화됩니다.

가장 광범위한 사용법을 가진 C/C ++ 컴파일러에는 자동 벡터화가 부족하여 이러한 벤치 마크는 크게 의존합니다.

바로 앞에 온 게시물 : Fortran에서 괄호가 사용되는 몇 가지 예가 있습니다. 알려진 C 컴파일러에는 더 중요한 최적화를 비활성화하지 않고 괄호를 관찰 할 수있는 옵션이 없습니다.

나는 몇 년 동안 Fortran과 C와 함께 광범위한 수학을하고있었습니다. 내 자신의 경험에서 Fortran은 때때로 C보다 낫지 만 속도는 속도가 좋지 않다고 말할 수 있습니다 (적절한 코딩 스타일을 사용하여 C가 Fortran만큼 빠르게 성능을 발휘할 수 있음). 큰 병렬화. 제 생각에, Fortran은 실제로 작업하기가 어색하며, 그 단점을 취소하기에 충분하지 않으므로 이제 C+GSL을 사용하여 계산을 수행하고 있습니다.

저는 애호가 프로그래머이고 두 언어 모두에서 "평균"입니다. C (또는 C ++) 코드보다 빠른 Fortran 코드를 작성하는 것이 더 쉽습니다. Fortran과 C는 모두 "역사적인"언어 (오늘날 표준), 크게 사용되며 무료 및 상업용 컴파일러를 잘 지원했습니다.

나는 그것이 역사적인 사실인지는 모르겠지만 Fortran은 평행/분산/벡터화/뭐든간에 지어진 것처럼 느낍니다. 그리고 오늘날 우리가 속도에 대해 이야기 할 때 "표준 지표"입니다. "확장합니까?"

순수한 CPU 크런치를 위해 나는 Fortran을 좋아합니다. IO와 관련된 것은 C와 함께 작업하기가 더 쉽다는 것을 알게됩니다 (어쨌든 두 경우 모두 어렵습니다).

물론, 병렬 수학 집약 코드의 경우 아마도 GPU를 사용하고 싶을 것입니다. C와 Fortran은 다소 잘 통합 된 Cuda/OpenCL 인터페이스 (및 현재 OpenACC)를 가지고 있습니다.

저의 객관적인 대답은 다음과 같습니다. 두 언어를 모두 똑같이 잘 알고 있지 않다면 Fortran에서 Fortran에 병렬/분산 코드를 작성하는 것이 더 빠르기 때문에 더 빠르다고 생각합니다 ( "Freeform"Fortran 및 "Freform"및 L을 작성할 수 있다는 것을 이해하면 " 엄격한 F77 코드뿐만 아니라

다음은 첫 번째 답변이 마음에 들지 않기 때문에 저를 다운 투표하려는 사람들을위한 두 번째 답변입니다. 두 언어 모두 고성능 코드를 작성하는 데 필요한 기능이 있습니다. 따라서 구현하고있는 알고리즘 (CPU 집중? IO 집중? 메모리 집약적?), 하드웨어 (단일 CPU? 멀티 코어? 분배 SuperComputer? GPGPU? FPGA), 기술 및 궁극적으로 컴파일러 자체에 따라 다릅니다. C와 Fortran에는 멋진 컴파일러가 있습니다. (나는 Fortran 컴파일러가 어떻게 진행되는지에 대해 진지하게 놀랐지 만 C 컴파일러도 마찬가지입니다).

추신 : Fortran Gui Libs에 대해 많은 나쁜 것들이 있기 때문에 Libs를 구체적으로 배제하게되어 기쁩니다. :)

나는 포탄이 C보다 훨씬 빠르다는 말을 듣지 못했지만 어떤 경우에는 더 빨리 생각할 수 있습니다. 그리고 열쇠는 존재하는 언어 특징이 아니라 (일반적으로)없는 언어 특징에 있습니다.

예는 C 포인터입니다. C 포인터는 거의 모든 곳에서 사용되지만 포인터의 문제는 컴파일러가 일반적으로 동일한 배열의 다른 부분을 가리키는 지 알 수 없다는 것입니다.

예를 들어, 당신이 다음과 같이 보이는 strcpy 루틴을 작성한 경우.

strcpy(char *d, const char* s)
{
  while(*d++ = *s++);
}

컴파일러는 D와 S가 겹치는 배열 일 수 있다는 가정하에 작동해야합니다. 따라서 배열이 겹칠 때 다른 결과를 생성하는 최적화를 수행 할 수 없습니다. 예상대로, 이것은 수행 할 수있는 최적화의 종류를 상당히 제한합니다.

C99에는 포인터가 겹치지 않는다는 컴파일러에게 명시 적으로 알려주는 "제한"키워드가 있습니다. 또한 Fortran도 C의 의미와 다른 시맨틱을 가지고 있지만 C에서와 같이 포인터는 유비쿼터스가 아닙니다.

그러나 C vs. Fortran 문제로 돌아 오면 Fortran 컴파일러가 (직접 작성된) C 프로그램에 대해 불가능할 수있는 일부 최적화를 수행 할 수 있습니다. 그래서 나는 그 주장에 너무 놀라지 않을 것입니다. 그러나 성능 차이가 그리 많지 않을 것으로 기대합니다. [~ 5-10%

Fortran과 C 간의 속도 차이는 컴파일러 최적화 기능과 특정 컴파일러가 사용하는 기본 수학 라이브러리의 함수입니다. Fortran에게는 C보다 빠르게 만들 수있는 내재적 인 것은 없습니다.

어쨌든, 좋은 프로그래머는 어떤 언어로든 Fortran을 쓸 수 있습니다.

빠르고 간단하게 :둘 다 똑같이 빠르지 만 Fortran은 더 간단합니다.결국 실제로 더 빠른 것은 알고리즘에 따라 다르지만 어쨌든 속도 차이는 상당히 없습니다. 이것은 2015 년 독일 고성능 컴퓨팅 센터 Stuttgard의 Fortran 워크숍에서 배운 것입니다. 저는 Fortran과 C와 함께 일하며이 의견을 공유합니다.

설명:

C는 운영 체제를 작성하도록 설계되었습니다. 따라서 고성능 코드를 작성하는 데 필요한 것보다 더 많은 자유가 있습니다. 일반적으로 이것은 문제가되지 않지만 신중하게 프로그래밍하지 않으면 코드를 쉽게 속도로 느리게 할 수 있습니다.

Fortran은 과학 프로그래밍을 위해 설계되었습니다. 이러한 이유로 Fortran의 주요 목적이므로 빠른 코드 구문 별 쓰기를 지원합니다. 여론과 달리, 포트란은 구식 프로그래밍 언어가 아닙니다. 최신 표준은 2010이며 새로운 컴파일러는 정기적으로 게시되며 대부분의 고성능 코드는 Fortran에 쓰여집니다. FORTRAN은 클래식 지시문 (C Pragmas)으로서 현대적인 기능을 추가로 지원합니다.

예시: 우리는 함수에 대한 입력 인수 (Fortran : Subroutine)로 큰 구조물을 제공하고자합니다. 함수 내에서 인수는 변경되지 않습니다.

C는 참조별로 전화 및 값으로 호출하여 편리한 기능입니다. 우리의 경우, 프로그래머는 우연히 가치별로 전화를 사용할 수 있습니다. 구조물을 먼저 메모리 내에서 복사해야하므로 이것은 상당히 느려집니다.

FORTRAN은 Call Wy Reference와 함께 작동하며, 이는 값 작동으로 전화를 원한다면 프로그래머가 구조물을 손으로 복사해야합니다. 우리의 경우 Fortran은 참조로 호출 된 C 버전만큼 자동으로 빠르게됩니다.

일반적으로 FORTRAN은 C보다 느립니다.C는 프로그래머가 직접 최적화할 수 있도록 하드웨어 수준 포인터를 사용할 수 있습니다.FORTRAN(대부분의 경우)은 해킹을 해결하는 하드웨어 메모리에 액세스할 수 없습니다.(VAX FORTRAN은 또 다른 이야기입니다.) 저는 70년대부터 FORTRAN을 켜거나 끌 정도로 사용해 왔습니다.(정말.)

그러나 90년대부터 FORTRAN은 본질적으로 병렬 알고리즘으로 최적화될 수 있는 특정 언어 구성을 포함하도록 발전했습니다. ~할 수 있다 멀티 코어 프로세서에 대해 정말 비명을 지르십시오.예를 들어, 자동 벡터화를 사용하면 여러 프로세서가 데이터 벡터의 각 요소를 동시에 처리할 수 있습니다.16개 프로세서 - 16개 요소 벡터 - 처리 시간이 1/16 정도 걸립니다.

C에서는 자체 스레드를 관리하고 다중 처리를 위한 알고리즘을 신중하게 설계한 다음 여러 API 호출을 사용하여 병렬 처리가 제대로 수행되는지 확인해야 합니다.

FORTRAN에서는 다중 처리를 위해 알고리즘을 주의 깊게 설계하기만 하면 됩니다.컴파일러와 런타임이 나머지를 처리할 수 있습니다.

당신은에 대해 조금 읽을 수 있습니다 고성능 포트란, 하지만 데드 링크가 많이 발견되었습니다.병렬 프로그래밍(예: OpenMP.org) 및 FORTRAN이 이를 지원하는 방법.

더 빠른 코드는 실제로 언어에 달려 있지 않습니다. 컴파일러이므로 ".Exe"내부에 묶인 부풀어 오르고 느리고 중복되는 객체 코드를 생성하는 MS-VB "컴파일러"를 볼 수 있지만 PowerBasic은 너무 생성됩니다. 더 나은 코드. C 및 C ++ 컴파일러에 의해 만든 객체 코드는 일부 단계 (최소 2)에서 생성되지만 설계에 의해 대부분의 Fortran 컴파일러는 높은 수준의 최적화를 포함하여 5 단계 이상의 단계를 가지고 있으므로 설계 fortran에 의해 항상 최적화 된 코드를 생성 할 수있는 기능이 있습니다. 따라서 결국 요청 해야하는 언어가 아닌 컴파일러가 있습니다. 내가 아는 최고의 컴파일러는 Linux와 Windows에서 가져올 수 있고 VS로 사용할 수 있기 때문에 Intel Fortran 컴파일러입니다. 저렴한 Tigh 컴파일러 OpenWatcom에서 항상 릴레이 할 수 있습니다.

이것에 대한 자세한 정보 :http://ed-thelen.org/1401project/1401-ibm-systems-journal-fortran.html

Fortran은 더 나은 I/O 루틴을 가지고 있습니다. 예를 들어 묵시적 DO 시설은 C의 표준 라이브러리와 일치 할 수없는 유연성을 제공합니다.

Fortran 컴파일러는 관련된 더 복잡한 구문을 직접 처리하며, 이러한 구문을 인수 전달 양식으로 쉽게 줄일 수 없으므로 C는 효율적으로 구현할 수 없습니다.

현대 표준과 컴파일러 사용, 아니요!

여기의 일부 사람들은 컴파일러가 별명에 대해 걱정할 필요가 없기 때문에 Fortran이 더 빠르다고 제안했습니다 (따라서 최적화 중에 더 많은 가정을 할 수 있음). 그러나 이것은 제한 키워드를 포함하여 C99 (I 생각) 이후 C에서 처리되었습니다. 기본적으로 컴파일러에게 알려주는 범위 내에서 포인터가 별명이 아니라고 말합니다. 또한 C는 적절한 포인터 산술을 가능하게하며, 앨리어싱과 같은 것들이 성능 및 리소스 할당 측면에서 매우 유용 할 수 있습니다. 최근 버전의 Fortran은 "적절한"포인터를 사용할 수 있다고 생각합니다.

현대 구현의 경우 C 일반적인 성능은 Fortran보다 성능이 우수합니다 (매우 빠르지 만).

http://benchmarksgame.alioth.debian.org/u64q/fortran.html

편집하다:

이것에 대한 공정한 비판은 벤치마킹이 편향 될 수있는 것 같습니다. 다음은 더 많은 맥락을 초래하는 또 다른 출처 (C와 관련하여)입니다.

http://julialang.org/benchmarks/

C는 일반적으로 대부분의 경우 Fortran보다 성능이 우수하다는 것을 알 수 있습니다 (다시 여기에 적용되는 비판을 참조하십시오). 다른 사람들이 말했듯이, 벤치마킹은 다른 언어보다 한 언어를 선호하기 위해 쉽게로드 할 수있는 부정확 한 과학입니다. 그러나 Fortran과 C가 비슷한 성능을 갖는 방법은 맥락에 있습니다.

Fortran은 배열, 특히 다차원 배열을 매우 편리하게 처리할 수 있습니다.Fortran에서 다차원 배열의 요소를 슬라이싱하는 것은 C/C++에서보다 훨씬 쉬울 수 있습니다.C++에는 이제 Boost나 Eigen과 같은 작업을 수행할 수 있는 라이브러리가 있지만 이는 결국 외부 라이브러리입니다.Fortran에서는 이러한 기능이 본질적입니다.

Fortran이 개발에 더 빠르거나 더 편리한지는 대부분 완료해야 하는 작업에 따라 다릅니다.지구물리학 분야의 과학 계산 전문가로서 저는 대부분의 계산을 Fortran에서 수행했습니다(현대 Fortran을 의미함, >=F90).

이것은 컴파일러의 품질에 들어가기 때문에 다소 주관적입니다. 그러나 언어/컴파일러의 관점에서 말하면 C에 대한 Fortran에 대해서는 C보다 본질적으로 더 빠르거나 더 나은 C에 대한 질문에 대한 질문에 대해보다 직접적인 질문에 답하기 위해 C에 대한 Fortran에 대해서는 아무것도 없습니다. 컴파일러의 품질, 각 언어의 프로그래머의 기술 및 해당 작업을 지원하는 고유 수학 지원 라이브러리가 궁극적으로 주어진 구현에 대해 더 빠를 것인지 결정합니다.

편집 : @nils와 같은 다른 사람들은 C에서 포인터 사용의 차이와 C에서 가장 순진한 구현을 느리게 할 수있는 별칭의 가능성에 대한 좋은 점을 제기했습니다. 그러나 C99에서이를 다루는 방법이 있습니다. , 컴파일러 최적화 플래그 및/또는 C가 실제로 작성되는 방식을 통해. 이것은 @nils 답변과 그의 답변에 따른 후속 의견으로 잘 다루었습니다.

대부분의 게시물은 이미 설득력있는 주장을 제시하므로 다른 측면에 속담 2 센트를 추가하겠습니다.

Fortran은 결국 처리 전력 측면에서 더 빠르거나 느리게하는 것이 중요하지만, Fortran에서 무언가를 개발하는 데 5 배 더 많은 시간이 걸리면 다음과 같습니다.

  • 순수한 숫자 크런치와 다른 작업에 대한 좋은 라이브러리가 부족합니다.
  • 문서화 및 단위 테스트를위한 괜찮은 도구가 부족합니다.
  • 표현력이 매우 낮고 코드 줄 수가 급증하는 언어입니다.
  • 그것은 문자열의 취급이 매우 열악합니다
  • 그것은 당신을 미치게하는 다른 컴파일러와 아키텍처 사이에서 비참한 양의 문제가 있습니다.
  • 그것은 매우 열악한 IO 전략이 있습니다 (순차적 파일의 읽기/쓰기. 예, 임의의 액세스 파일이 존재하지만 사용 된 적이 있습니까?)
  • 그것은 좋은 개발 관행, 모듈화를 장려하지 않습니다.
  • 완전한 표준적이고 완전히 준수하는 OpenSource 컴파일러의 효과적인 부족 (Gfortran과 G95는 모든 것을 지원하지는 않습니다)
  • C와의 상호 운용성이 매우 열악합니다 (Mangling : 하나의 밑줄, 두 개의 밑줄, 밑줄이없고 밑줄이없고 일반적으로 밑줄이 있지만 다른 밑줄이있는 경우 2 개는 공통 블록을 탐구하지 마십시오 ...)

그런 다음 문제는 관련이 없습니다. 무언가가 느리면, 대부분의 시간은 주어진 한계를 넘어서 개선 할 수 없습니다. 더 빨리 원하는 경우 알고리즘을 변경하십시오. 결국 컴퓨터 시간은 저렴합니다. 인간의 시간은 아닙니다. 인간의 시간을 줄이는 선택을 소중히 여기십시오. 컴퓨터 시간이 증가하면 비용 효율적입니다.

Fortran은 전통적으로 -fp : strict와 같은 옵션을 설정하지 않습니다 (IFORT는 F2003 표준의 일부인 ieee_arithmetic을 사용하는 기능 중 일부를 활성화해야 함). Intel C ++는 또한 -fp : strict를 기본값으로 설정하지는 않지만 Errno 처리에 필요하며 다른 C ++ 컴파일러는 Errno를 끄거나 SIMD 감소와 같은 최적화를 얻는 것이 편리하지 않습니다. GCC와 G ++는 위험한 조합 -O3 -ffast -math -fopenmp -march = Native를 사용하지 않도록 makefile을 설정해야했습니다. 이러한 문제 이외에도 상대 성능에 대한이 질문은 컴파일러 및 옵션 선택에 대한 지역 규칙에 더 큰 영향을 미치고 의존합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top