코어레이 포트란
Coarray Fortran![]() |
패러다임 | 멀티패키지: 병렬, 메시지 전달, 필수(구조적, 객체 지향), 구조화 |
---|---|
설계자 | 로버트 넘리치와 존 리드 |
개발자 | PL22.3 Fortran 위원회 |
안정된 릴리스 | Fortran 2008 (ISO/IEC 1539-1:2010) |
타이핑 분야 | 강력, 정적 |
OS | 크로스 플랫폼 |
주요 구현 | |
Cray, g95, GNU Fortran, 인텔 Fortran 컴파일러, Rice CAF 2.0, OpenUH, NAG Fortran 컴파일러 | |
영향을 받다 | |
포트란 |
Coarray Fortran(이전 명칭: F--)은 1990년대에 Robert Numrich와 John Reid에 의해 작성된 병렬 처리를 위한 Fortran 95/2003의 확장으로 시작되었습니다.2005년 5월 ISO Fortran 위원회 회의에서 결정된 대로 Fortran 2008 표준(ISO/IEC 1539-1:2010)에는 코어레이(하이픈 없이 입력)가 포함되어 있습니다. Fortran 2008 표준의 구문은 원래의 CAF 제안과 약간 다릅니다.
CAF 프로그램은 여러 번 복제되고 모든 복사본이 비동기적으로 실행된 것으로 해석됩니다.각 복사본은 고유한 데이터 개체 집합을 가지며 이미지라고 합니다.Fortran의 배열 구문은 대괄호로 둘러싸인 추가 후행 첨자를 사용하여 확장되어 여러 이미지에 걸쳐 있는 데이터에 대한 참조를 간결하게 표현합니다.
CAF 확장은 Cray의 컴파일러 (릴리스 3.1 이후)와 같은 일부 Fortran 컴파일러에서 구현되었습니다.Fortran 2008 표준에 코어레이가 포함된 이후 구현 수가 증가하고 있습니다.Linux 아키텍처용 Fortran 2008 표준에 명시된 대로 코어레이를 구현한 최초의 오픈 소스 컴파일러는 G95입니다.현재 GNU Fortran은 단일 및 다중 이미지 구성(OpenCoarrays 라이브러리에 기반)에서 Fortran의 코어레이 기능을 광범위하게 제공합니다.Fortran 2008의 코레이 및 관련 병렬 확장의 다른 구현은 Open에서 이용할 수 있습니다.UH 컴파일러(Open64의 분기)는 휴스턴 대학에서 개발되었습니다.
컴파일러에서의 실장
CAF는 휴대성을 위해 Message Passing Interface(MPI; 메시지 패싱 인터페이스) 라이브러리 위에 구현되는 경우가 많습니다.GNU Fortran 및 Open에서 사용할 수 있는 구현과 같은 일부 구현UH 컴파일러는 분할된 글로벌 주소 공간 언어를 지원하도록 설계된 다른 하위 계층(예를 들어 GASNet)에서 실행될 수 있습니다.
예
아래에 간단한 예를 제시하겠습니다.CAF는 브리스톨 대학에서 개발한 다결정 재료를 시뮬레이션하기 위한 오픈 소스 패키지인 CGPACK에 사용됩니다.[1]
프로그램.Hello_World 암묵적 없음 정수 :: i ! 로컬 변수 성격(렌=20) :: 이름.[*] ! scalar coarray, 각 이미지에 대해 1개의 "이름"을 지정합니다. 주의: "name"은 로컬 변수이며 "name[<index>]"은 로컬 변수입니다. ! 변수, "name[this_image()]"는 "name"과 동일합니다. ! 이미지 1의 사용자와 대화합니다.다른 모든 사용자에 대한 실행은 통과합니다. 한다면 (this_image() == 1) 그리고나서 쓰다(*,'(a)',발전='아니요') '이름 입력: ' 읽어주세요(*,'(a)') 이름. ! 다른 이미지로 정보 전달 하다i = 2, num_module() 이름.[i] = 이름. end do를 하다 이면 끝이다 모두 동기화 ! 데이터가 도착했는지 확인하는 장벽입니다. ! 모든 이미지의 I/O가 임의의 순서로 실행되지만 기록된 각 레코드는 손상되지 않습니다. 쓰다(*,'(3a,i0)') '여보세요',다듬다(이름.),'이미지에서'에서', this_image() 종료 프로그램Hello_world
위의 프로그램은 정보를 배포하는 루프가 순차적으로 실행되기 때문에 확장성이 떨어집니다.확장 가능한 프로그램을 작성하려면 병렬 알고리즘에 대한 정교한 이해, 기본 네트워크 특성에 대한 자세한 지식 및 데이터 전송 크기 등의 애플리케이션 특성에 대한 특별한 조정이 필요한 경우가 많습니다.대부분의 응용 프로그램 개발자에게 컴파일러 또는 런타임 라이브러리가 최적의 알고리즘을 결정하도록 하는 것이 보다 견고하고 고성능임을 증명합니다.Fortran 2018은 컴파일러 및 런타임 라이브러리 팀이 집단 통신 및 분산 계산을 위한 효율적인 병렬 알고리즘을 집합 서브루틴으로 캡슐화할 수 있도록 지원하는 집합 통신 서브루틴을 제공합니다.이러한 서브루틴 및 기타 새로운 병렬 프로그래밍 기능은 Fortran 표준 위원회가 Fortran 2018에 통합하기로 의결한 기술 사양에 요약되어 있습니다.이를 통해 사용자는 위의 알고리즘의 보다 효율적인 버전을 작성할 수 있습니다.
프로그램.Hello_World 암묵적 없음 성격(렌=20) :: 이름.[*] ! scalar coarray, 각 이미지에 대해 1개의 "이름"을 지정합니다. 주의: "name"은 로컬 변수이며 "name[<index>]"은 로컬 변수입니다. ! 변수, "name[this_image()]"는 "name"과 동일합니다. ! 이미지 1의 사용자와 대화합니다.다른 모든 사용자에 대한 실행은 통과합니다. 한다면 (this_image() == 1) 그리고나서 쓰다(*,'(a)',발전='아니요') '이름 입력: ' 읽어주세요(*,'(a)') 이름. 이면 끝이다 ! 모든 이미지에 정보 배포 불러코_리모트(이름.,source_image=1) ! 모든 이미지의 I/O가 임의의 순서로 실행되지만 기록된 각 레코드는 손상되지 않습니다. 쓰다(*,'(3a,i0)') '여보세요',다듬다(이름.),'이미지에서'에서', this_image() 종료 프로그램Hello_world
여기서 명시적 동기화가 부족하면 이미지 간의 조율이 줄어들기 때문에 성능이 향상될 가능성이 있습니다.게다가 TS 18508은, 「이미지로부터의 전송은, 그 이미지상에서 집합 서브루틴이 호출되기 전에는 행해지지 않는다」라고 보증한다.이는 co_broadcast 내부의 일부 동기화를 의미하지만 앞의 예에서 "sync all"보다 더 높은 성능을 나타낼 수 있습니다.TS 18508에는 아래에 기술된 CAF 2.0의 대처가 목표로 하는 문제를 다루는 몇 가지 새로운 기능도 포함되어 있습니다.예를 들어 이미지 및 이벤트 팀이 있습니다.
다른 관점
![]() | 이 섹션은 특정 시점을 기준으로 균형이 맞지 않을 수 있습니다.(2018년 9월) |
2011년, Rice University는 Fortran [3]언어에 대한 coarray 확장의 대체 비전을 추구했습니다.Fortran 2008 표준 위원회의 설계 선택은 병렬 프로그래밍을 지원하기 위해 최선의 확장 세트를 조합하는 것보다 언어에 대한 수정을 가능한 한 적게 도입하고자 하는 욕구에 의해 형성되었다는 것이 이들의 견해입니다.Numrich와 Reid의 원래 설계와 Fortran 2008용으로 제안된 coarray 확장 모두 다음과 같은 단점을 안고 있습니다.
- 프로세서 서브셋은 지원되지 않습니다.예를 들어 모든 이미지에 코어레이를 할당해야 합니다.
- coarray 확장에는 모든 종류의 링크된 데이터 구조를 만들고 조작하는 데 필수적인 글로벌 포인터의 개념이 없습니다.
- 상호 배제를 위해 명명된 중요 섹션에 의존하면 데이터 개체가 아닌 코드 영역과 상호 배제를 연결함으로써 확장 가능한 병렬화가 방해됩니다.
- Fortran 2008의 sync images 문은 안전한 동기화 공간을 제공하지 않습니다.그 결과, 라이브러리 콜이 발신되었을 때에 보류중의 유저 코드의 동기 조작에 의해서, 라이브러리 콜의 동기화가 방해될 가능성이 있습니다.
- 리모트 이미지의 데이터를 조작할 때 지연을 회피하거나 허용하는 메커니즘은 없습니다.
- 집단 커뮤니케이션은 지원되지 않습니다.
이러한 단점을 해결하기 위해 Rice University 그룹은 Coarray Fortran 프로그래밍 모델의 클린 슬레이트 재설계를 개발하고 있습니다.Coarray Fortran 2.0이라고 불리는 Rice의 Coarray Fortran의 새로운 디자인은 생산적인 병렬 프로그래밍 모델을 제공하도록 설계된 Fortran의 Coarray 기반 확장의 표현적인 세트입니다.Fortran 2008과 비교하여 Rice의 새로운 coarray 기반 언어 확장 기능에는 다음과 같은 몇 가지 추가 기능이 포함되어 있습니다.
- 팀으로 알려진 프로세스 하위 집합은 쌍별 연산을 위해 프로세스 이미지의 코어레이, 집단 커뮤니케이션 및 상대 인덱싱을 지원합니다.
- 논리적인 커뮤니케이션 구조를 가진 팀을 증가시키는 토폴로지입니다.
- 코어레이 및 기타 공유 데이터의 동적 할당/해제
- 팀 기반 코어레이 할당 및 할당 해제,
- 동적 데이터 구조를 지원하는 글로벌 포인터
- 지연 시간 숨기기 및 방지 지원
- 비동기 복사,
- 비동기 집합 작업 및
- 함수 출하
- 프로그램 실행을 세밀하게 제어하기 위한 동기화 지원이 강화되었습니다.
- 잠금 및 잠금 세트를 포함하여 상호 배제를 위한 안전하고 확장 가능한 지원
- 이벤트: 포인트 투 포인트 동기화를 위한 안전한 공간을 제공합니다.
- cofence: 비동기 조작의 로컬 완료를 강제합니다.
- finish는 팀 전체에서 비동기 작업을 강제로 완료시키는 장벽과 같은 SPMD 구조입니다.
「 」를 참조해 주세요.
레퍼런스
- ^ A. Shterenlikht, 3D 셀룰러 오토마타 미세 구조 시뮬레이션을 위한 Fortran coarray 라이브러리 Wayback Machine에서 2016-03-04 아카이브, (2013) Eds. M. Weiland, Eds. Weiland, A. Jackson, N. Johnson, Edinburgurgins, Edinburgins.에 의해 발행된 Wayburgins.에서 보관되었습니다. ISBN978-0-9926615-0-2
- ^ TS 18508 Fortran의 기타 병렬 기능
- ^ "CoArray Fortran 2.0".