HPC에는 많은 포트란이 사용되지만 이것이 레거시 이유인지 확실하지 않습니다.
가비지 수집 또는 런타임 다형성과 같은 최신 프로그래밍 언어의 기능은 속도가 중요하므로 C # 또는 Java 또는 C ++가 어디로 들어오는 지 확실하지 않기 때문에 HPC에는 적합하지 않습니다.
이견있는 사람?
HPC에는 많은 포트란이 사용되지만 이것이 레거시 이유인지 확실하지 않습니다.
가비지 수집 또는 런타임 다형성과 같은 최신 프로그래밍 언어의 기능은 속도가 중요하므로 C # 또는 Java 또는 C ++가 어디로 들어오는 지 확실하지 않기 때문에 HPC에는 적합하지 않습니다.
이견있는 사람?
답변:
나는 (1) 레거시 코드가 거의없고, (2) 개발 시간과 코드 품질이 중요한 영역에서 HPC에 사용되는 많은 Java를 보았다. 일반적인 응용 분야는 재무, 데이터 마이닝 또는 생물 정보학입니다.
실제로 응용 프로그램에 의존하지만 (선형 대수 외부에 생명이 있습니다) 최근 JVM의 성능은 종종 C 코드와 동등합니다. 정적 컴파일러 (C, Fortran)가 수행 할 수없는 런타임 영리한 최적화에서 JVM이 수행 할 수있는 경우가 더 빠릅니다. 그리고 많은 기호 계산이있을 때 확실히 빠릅니다.
프로그램 개발에 일정한 시간이 주어지면 결과 Java 코드는 C 코드보다 일관되게 빠릅니다. Java의 HPC는 코드가 자주 개발되거나 수정 될 때 확실히 의미가 있습니다. 또 다른 중요한 기능은 다른 하드웨어를 통한 코드 이동성입니다.
http://ateji.blogspot.com/2010/09/java-for-high-performance-computing.html 에서 참조를 찾을 수 있습니다
두 주소가 고유하다는 Fortran의 가정과 관련하여, 우리는 "불량한 일이 발생할 수 있습니다"비트가없는 고급 언어의 코드에 대해 유사한 최적화를 가능하게하는 정적 분석 도구를 개발하고 있습니다. 관심이 있으시면 저에게 연락하십시오.
최대 5 년 전을 경험, 내 년 동안, 항상 포트란 및 C 어느 하나가 사람들이 더 엔지니어링에서 이상 생각의 CS 학교에서 온 여부에 주로 의존하고있다 (내가 넣어하는 방법을 모르겠어요이 더 나은 좋아요? :-)
우리가하고있는 일에서 포트란은 거의 독점적으로 사용되었습니다.
요즘 읽은 내용에서 Standard F2003 / 08에 대한 새로운 업데이트와 Co-Arrays가 도입되면서 다시 모멘텀을 얻고있는 것 같습니다.
또한 약간 편견이 아닌 기사- 이상적인 HPC 프로그래밍 언어
금속에 대한 실제 페달을 생각할 때 유일한 선택은 포트란입니다. 낮은 수준의 ILP (Instruction Level Parallism)를 악용하기위한 가장 중요한 것은 메모리 주소 명확성 때문입니다. Fortran의 사실상의 규칙을 통해 컴파일러는 두 주소가 고유한지 확인할 수 있습니다 (따라서로드 및 저장 순서 또는 심지어 저장 및 저장 순서가 잘못된 코드를 생성 할 위험없이 상호 교환 될 수 있음). C는 컴파일러가 코드에서 낮은 수준의 병렬 처리를 추출하기 위해 겹치는 포인터에 대한 범위를 너무 많이 둡니다.
또한 효율적인 루프 생성 및 실행에는 어레이 정렬, wrt 캐시 라인 및 SSE / AVX 경계가 중요합니다. 어레이가 공통 블록을 통해 전달되는 경우 컴파일러 / 로더는 모든 어레이가 동일한 주소 정렬 경계에서 시작되도록하고보다 효율적인 SSE / AVX로드 및 저장을 활용할 수 있습니다. 최신 하드웨어는 정렬되지 않은 메모리 액세스를 처리 할 수 있지만 메모리 액세스가 캐시 라인을 부분적으로 올바르게 사용하지 않기 때문에 성능이 저하됩니다. C 프로그래머가 모든 배열을 올바르게 정렬하더라도 컴파일러와 통신하는 메커니즘이 있습니까?
요약하면, 가장 중요한 두 가지 문제는 메모리 주소의 독립성과 액세스 된 데이터 구조가 하드웨어가 원하는 동일한 "자연"정렬을 갖는 컴파일러의 인식입니다. 지금까지 Fortran은이 두 가지 작업에서 최선을 다합니다.
일화적인 메모 일뿐입니다. 나는 고성능 컴퓨팅을 직접 수행하지 않았습니다.
계산 (숫자 크 런칭), Fortran 및 C의 경우 예 : 기존의 이유입니다.
숫자 크 런칭의 현재 추세는 클러스터 특성에 따라 성능을 최적화하기 위해 소스 코드 조정을 자동화하는 프로그램 생성기를 작성하는 것입니다. 이 발전기는 종종 C로 출력됩니다.
두 번째 트렌드는 특정 GPU 또는 Cell BE에 대해 C의 특수한 방언으로 작성하는 것입니다.
데이터베이스 자체가 아닌 데이터베이스의 데이터를 처리하는 프로그램과 같은 숫자가 아닌 작업의 경우 고가의 맞춤형 네트워킹 장비없이 "상품"시스템의 클러스터에서 실행하는 것이 훨씬 저렴합니다. 이를 일반적으로 "고 처리량 컴퓨팅"이라고합니다. 그리고 파이썬은 여기에서 # 1 언어입니다 (유명한 맵 리 듀스 사용). 파이썬 이전에 배치 처리 프로젝트는 모든 언어로 작성 될 수 있으며 일반적으로 Condor에 의해 발송됩니다 .
나는 C #에서 매우 계산 집약적 인 코드를 연구하고있다.
광학 모델링을 위해 FDTD 의 GPGPU 구현을 구축 중 입니다. 소규모 (128 프로세서) 클러스터에서 많은 시뮬레이션을 실행하는 데 몇 주가 걸립니다. 그러나 GPU 구현은 약 50 배 빠르게 실행되는 경향이 있으며 이는 소비자 등급 NVidia 카드에 있습니다. 우리는 이제 2 개의 GTX295 듀얼 프로세서 카드 (수백 코어)를 가진 서버를 보유하고 있으며 곧 Teslas를 출시 할 예정입니다.
이것이 당신의 언어와 어떤 관련이 있습니까? 이전에 우리가 사용했던 C ++ FDTD 코드가 CPU에 바운드 된 것과 같은 방식으로, 이들은 GPU에 바운드되어 있기 때문에 관리되는 코드와 네이티브 코드 의 ( 매우 작은) 마력 차이가 전혀 발생하지 않습니다. C # 앱은 OpenCL 커널로드, GPU로 /로부터 데이터 전달, 사용자 인터페이스 제공,보고 등-C ++의 엉덩이에 고통을주는 모든 작업의 지휘자로 작동합니다.
과거 몇 년 동안 관리되는 코드와 관리되지 않는 코드의 성능 차이는 상당량의 속도를 얻기 위해 C ++의 끔찍한 개체 모델을 사용하는 것이 좋을 정도로 중요했습니다. 오늘날 C ++과 C #의 개발 비용은 대부분의 응용 프로그램의 이점보다 훨씬 큽니다.
또한 대부분의 성능 차이는 선택한 언어가 아니라 개발자의 기술에서 비롯됩니다. 몇 주 전, 3 중 배열 (3D 배열 순회) 루프 내부에서 단일 분할 작업을 이동하여 주어진 계산 도메인의 실행 시간을 15 % 단축했습니다. 이는 프로세서 아키텍처의 결과입니다. 분할 속도가 느립니다. 이는 어딘가에서 선택해야 할면 중 하나입니다.
포트란은 레거시 (아직 오래된 코드를 실행하는 사람)와 친숙성 (HPC를하는 대부분의 사람들이 다른 종류의 언어에 익숙하지 않음)으로 인해 가장 일반적입니다.
가비지 수집 또는 런타임 다형성과 같은 최신 프로그래밍 언어의 기능은 속도가 중요하므로 C # 또는 Java 또는 C ++가 어디로 들어오는 지 확실하지 않기 때문에 HPC에는 적합하지 않습니다.
그것은 일반적으로 사실이 아닙니다. 고전 HPC는 대부분 기계 정밀도 숫자로 선형 대수학을 수행했습니다. 그러나 최신 HPC는 기계 정밀도 숫자 대신 임의의 수학 식을 사용한 기호 계산과 같이보다 광범위한 크 런칭을 위해 슈퍼 컴퓨터를 점점 더 많이 사용하고 있습니다. 이것은 사용하는 도구에 매우 다른 특성을 부여하며 GC 및 OCaml의 최적화 패턴 일치 컴파일러와 같은 다른 종류의 최적화 컴파일러 없이는 기호 계산이 매우 어려울 수 있으므로 Fortran 이외의 프로그래밍 언어를 사용하는 것은 드문 일이 아닙니다.
예를 들어, 판독 이 용지 FISCHBACHER 의해 외. "저자들은 이것이 지금까지 수행 된 가장 큰 상징적 계산 일 수 있다고 믿을만한 강력한 이유가있다"고 말합니다.
포트란, 좋은 이유와 그렇지 않은 이유가 있습니다. 많은 수학 크 런칭을 위해서는 Fortran으로 작성된 광범위한 서브 루틴 라이브러리 (BLAS, LAPACK)가 있으며 이는 모두 C 및 C ++에서 호출 할 수 있습니다.
좋지 않은 이유는 Fortran의 C / C ++에 비해 성능상의 이점이 있기 때문입니다. 옵티마이 저는 꽤 훌륭하며 코드 조각을 최적화하는 이점이 사용중인 시간의 백분율에 비례한다는 것을 이해하는 사람은 거의 없습니다. 거의 모든 코드에서 거의 0입니다.
그리 좋지 않은 또 다른 이유는 CS와 비 CS 프로그래머 간의 문화 차이입니다. 과학 프로그래머들은 포트란에서 나쁜 습관을 배우는 경향이 있으며, CS 프로그래머와 그들이 가르친 나쁜 습관, 그리고 전자를 내려다 보는 나쁜 습관을 내려다 보는 경향이 있습니다 .
기본적으로, 번호 크 런칭의 실제 작업을 수행하는 모든 프로그램은 여전히 FORTRAN입니다 (오래된 blas, lapack, arnoldi 등은 여전히 사용되는 프로그램입니다). C ++.
시뮬레이션의 복잡성에는 큰 코드가 필요하며, 코드를 작성하는 것에서 어떤 종류의 이점을 얻는 것은 재사용 할 수있게하는 것입니다. 또한 사용 된 개념도 매우 복잡해졌습니다. FORTRAN을 사용하여 해당 정보를 나타내는 것은 거의 광기입니다. C ++은 본질적으로 객체 지향 디자인을 지원하기 때문에 C ++이 등장합니다. 그러나 런타임 다형성은 거의 선호되지 않습니다. 대신 사람들은 거의 항상 정적 다형성 (템플릿 메타 프로그래밍으로 C ++에서 구현 됨)을 사용합니다.
또한 컴파일러는 실제로 훌륭하므로 많은 최적화가 컴파일러에 맡겨집니다.
HPC 응용 프로그램에서 해결해야하는 두 가지 종류의 문제가 있습니다. 하나는 숫자 크 런칭 자체이고 다른 하나는 계산 관리입니다. 첫 번째는 일반적으로 속도와이 언어로 작성된 많은 과학적 알고리즘이 있기 때문에 Fortran, C 또는 C ++로 작성된 코드를 사용하여 접근합니다. 계산의 조정은 고급 언어로보다 편리하게 구현됩니다. Python은 응용 프로그램 논리를 처리하고 컴파일 된 언어로 구현 된 확장을 호출하기위한 "접착제"언어입니다. Java는 네트워킹 및 분산 컴퓨팅 관리가 필수적인 프로젝트에서 자주 사용됩니다.