자동 병렬화 도구
Automatic parallelization tool이 문서는 갱신할 필요가 있습니다.(2019년 9월) |
수년간 병렬 하드웨어는 분산 컴퓨팅에만 사용 가능했지만 최근에는 로우엔드 컴퓨터에도 사용 가능해지고 있습니다.따라서 소프트웨어 프로그래머들이 병렬 애플리케이션 작성을 시작하는 것이 불가피해졌다.프로그래머가 순차적으로 생각하는 것은 매우 자연스러운 일이기 때문에 멀티 스레드 애플리케이션이나 병렬 처리 애플리케이션 작성에 익숙하지 않습니다.병렬 프로그래밍은 동기화 및 교착 방지와 같은 다양한 문제를 처리해야 합니다.프로그래머는 어플리케이션 도메인에서의 전문지식과 별도로 이러한 어플리케이션을 작성하기 위한 추가 전문지식을 필요로 합니다.따라서 프로그래머들은 순차적 코드를 쓰는 것을 선호하며 대부분의 인기 있는 프로그래밍 언어들이 그것을 지원한다.이를 통해 응용 프로그램에 더욱 집중할 수 있습니다.따라서 자동 툴을 사용하여 순차적인 애플리케이션을 병렬 애플리케이션으로 변환할 필요가 있습니다.또한 지난 수십 년간 작성된 대량의 레거시 코드를 재사용하고 병렬화해야 하기 때문에 이러한 요구는 그리 간단하지 않습니다.
자동 병렬화의 필요성
과거의 기술은 FORTRAN이나 C와 같은 언어에 대한 솔루션을 제공했지만, 이것만으로는 충분하지 않습니다.이러한 기술은 루프 또는 코드의 특정 섹션과 같은 특정 시스템을 염두에 둔 병렬화 섹션을 다루었습니다.멀티스레드 애플리케이션을 생성할 때 병렬화 기회를 식별하는 것은 매우 중요한 단계입니다.이러한 애플리케이션 병렬화의 필요성은 병렬화를 이용하기 위해 코드를 분석하는 도구를 통해 부분적으로 해결됩니다.이러한 도구는 컴파일 시간 기법 또는 런타임 기법 중 하나를 사용합니다.이러한 기술은 일부 병렬 컴파일러에 내장되어 있지만 사용자는 병렬 코드를 식별하고 특수한 언어 구조를 사용하여 코드를 표시해야 합니다.컴파일러는 이러한 언어구조를 식별하고 병렬화를 위해 표시된 코드를 분석합니다.일부 도구는 루프와 같은 특수한 형식의 코드만 병렬화합니다.따라서 순차 코드를 병렬 코드로 변환하기 위한 완전 자동 툴이 필요합니다.[1]
병렬화의 일반적인 절차
1. 프로세스는 프로그래머가 병렬처리 가능성을 갖는다고 느끼는 코드 섹션을 식별하는 것으로 시작합니다.코드 병렬화를 원하는 프로그래머가 원래 고려 중인 코드를 작성하지 않았기 때문에 이 작업은 종종 어렵습니다.또 다른 가능성은 프로그래머가 응용 프로그램 도메인에 처음 온다는 것입니다.따라서 병렬화 과정의 이 첫 번째 단계는 처음에는 쉬워 보이지만 그렇지 않을 수 있습니다.
2. 다음 단계는 식별된 코드 섹션 중 실제로 병렬화된 코드 섹션의 목록을 작성하는 것입니다.이 단계는 많은 분석을 수반하기 때문에 다시 가장 중요하고 어렵다.일반적으로 포인터가 관련된 C/C++의 코드에 대해서는 분석이 어렵습니다.포인터 에일리어스 분석, 함수 부작용 분석과 같은 많은 특수 기술은 코드의 섹션이 다른 코드에 의존하는지 여부를 결론짓기 위해 필요합니다.식별된 코드 섹션의 의존성이 높을 경우 병렬화의 가능성은 감소합니다.
3. 코드를 변경함으로써 의존관계가 제거되는 경우가 있으며, 이것이 병렬화의 다음 단계입니다.기능 및 출력은 변경되지 않지만 다른 코드 섹션 또는 다른 명령에 대한 종속성이 있는 경우 제거되도록 코드가 변환됩니다.
4. 병렬화의 마지막 단계는 병렬 코드를 생성하는 것입니다.이 코드는 기능적으로는 항상 원래 순차 코드와 유사하지만 실행 시 여러 스레드 또는 프로세스를 생성하는 추가 구성 요소 또는 코드 섹션이 있습니다.
자동 병렬화 기술
메인 기사 자동 병렬화도 참조하십시오.
스캔
이것은 스캐너가 입력 소스 파일을 읽어 모든 정적 및 외부 사용을 식별하는 첫 번째 단계입니다.파일 내의 각 행은 토큰으로 분리하기 위해 미리 정의된 패턴과 대조됩니다.이러한 토큰은 나중에 문법 엔진에서 사용할 파일에 저장됩니다.문법 엔진은 미리 정의된 규칙과 일치하는 토큰 패턴을 검사하여 코드 내의 변수, 루프, 제어문, 함수 등을 식별합니다.
분석하다
분석기는 동시에 실행할 수 있는 코드 섹션을 식별하는 데 사용됩니다.분석기는 스캐너 파서가 제공하는 정적 데이터 정보를 사용합니다.분석기는 먼저 서로 완전히 독립적인 모든 기능을 찾아 개별 작업으로 표시합니다.그런 다음 분석기는 종속성이 있는 작업을 찾습니다.
스케쥴
스케줄러는 실행 시간과 시작 시간 측면에서 모든 태스크와 각 태스크의 상호 의존성을 나열합니다.스케줄러는 사용하는 프로세서의 수 또는 애플리케이션의 총 실행 시간의 관점에서 최적의 스케줄을 작성합니다.
코드 생성
스케줄러는 모든 태스크와 해당 태스크가 실행되는 코어의 상세 목록과 실행 시간을 생성합니다.코드 생성기는 스케줄러가 실행하는 동안 읽을 코드에 특수 구성을 삽입합니다.이러한 구성은 스케줄러에게 특정 태스크가 어떤 코어로 실행되는지 시작 및 종료 시간과 함께 지시합니다...
병렬화 도구
Fortran, C, C++ 및 기타 여러 언어에 대한 자동 병렬화 도구가 있습니다.
유카
YUCCA는 KPIT Technologies Ltd가 개발한 Sequential to Parallel 자동 코드 변환 도구입니다.Pune. 여러 소스 파일과 헤더 파일이 있을 수 있는 C 소스 코드로 입력을 받습니다.pthreads 함수 및 OpenMP 구조를 사용하여 변환된 멀티 스레드 병렬 코드로 출력을 제공합니다.YUCCA 툴은 태스크레벨과 루프레벨의 병렬화를 수행합니다.
Par4 전체
Par4All은 C 및 Fortran 시퀀셜 프로그램용 자동 병렬화 및 최적화 컴파일러(워크벤치)입니다.이 소스 투 소스 컴파일러의 목적은 기존 애플리케이션을 멀티코어 시스템, 고성능 컴퓨터, GPU 등 다양한 하드웨어 타깃에 적응시키는 것입니다.그러면 새로운 소스 코드가 생성되므로 응용 프로그램의 원래 소스 코드가 변경되지 않습니다.
고래자리
Cetus는 소프트웨어 프로그램의 소스 대 소스 변환을 위한 컴파일러 인프라입니다.이 프로젝트는 Purdue University에 의해 개발되었습니다.Cetus는 자바어로 쓰여져 있다.자동 병렬화 도구 또는 컴파일러를 쓰기 위한 기본 인프라스트럭처를 제공합니다.Cetus가 현재 구현하고 있는 기본적인 병렬화 기법은 민영화, 감소 변수 인식 및 유도 변수 치환이다.
2013년 2월에 새로운 그래픽 사용자 인터페이스(GUI)가 추가되었습니다.2013년 5월에 속도 향상 계산 및 그래프 표시가 추가되었습니다.클라이언트-서버 모델의 Cetus 리모트서버가 2013년 5월에 추가되어 사용자는 옵션으로 서버를 통해 C코드를 변환할 수 있습니다.이는 Linux 이외의 플랫폼에서 사용자가 Cetus를 실행할 때 특히 유용합니다.2013년 5월에는 실험적인 Hubzero 버전의 Cetus도 구현되었으며 사용자는 웹 브라우저를 통해 Cetus를 실행할 수 있습니다.
명왕성
PLUTO는 다면체 모델에 기초한 자동 병렬화 도구입니다.컴파일러 최적화를 위한 다면체 모델은 루프 네스트 최적화 및 루프 병렬화와 같은 높은 수준의 변환을 편리하게 수행할 수 있도록 하는 프로그램의 표현입니다.Pluto는 C 프로그램을 소스에서 소스로 변환하여 세분화된 병렬 처리 및 데이터 인접성을 동시에 제공합니다.핵심 변환 프레임워크는 주로 효율적인 타일링 및 융접을 위한 아핀 변환을 찾아 작동하지만 이에 국한되지는 않습니다.연속된 C 프로그램 섹션에서 멀티코어용 OpenMP 병렬 코드를 자동으로 생성할 수 있습니다.
폴라리스 컴파일러
Polaris 컴파일러는 Fortran77 프로그램을 입력으로 사용하여 병렬 컴퓨터에서 효율적으로 실행되도록 이 프로그램을 변환하고 이 프로그램 버전을 몇 가지 가능한 병렬 Fortran 방언 중 하나로 출력합니다.Polaris는 몇 가지 "컴파일 패스"를 통해 변환을 수행합니다.Polaris에는 일반적으로 알려진 많은 패스와 더불어 다음 작업을 수행하는 고급 기능이 포함되어 있습니다.어레이 민영화, 데이터 의존성 테스트, 유도 변수 인식, 절차 간 분석 및 심볼릭 프로그램 분석.
인텔 C++ 컴파일러
인텔 C++ 컴파일러의 자동 병렬화 기능은 입력 프로그램의 시리얼 부분을 의미상 동등한 멀티 스레드 코드로 자동 변환합니다.자동 병렬화는 작업 공유 후보가 되는 루프를 판별하고 데이터 흐름 분석을 수행하여 올바른 병렬 실행을 검증하며 OpenMP 디렉티브를 사용한 프로그래밍에 필요한 스레드 코드 생성을 위해 데이터를 분할합니다.OpenMP 및 자동 병렬화 애플리케이션은 멀티프로세서 시스템의 공유 메모리에서 성능을 향상시킵니다.
인텔 어드바이저
인텔 어드바이저 2017은 벡터화 최적화 및 스레드 프로토타이핑 도구입니다.워크플로우에 여러 단계를 통합하여 병렬 사이트를 검색하고 사용자가 벡터화와 스레드화를 위한 루프를 마킹할 수 있도록 하며 루프 캐리어 의존관계 및 메모리액세스 패턴을 체크하고 벡터화와 스레드화를 위한 플러그마를 삽입합니다.
AutoPar
AutoPar는 입력 시리얼 C/C++ 코드에 OpenMP 플러그마를 자동으로 삽입할 수 있는 도구입니다.기존 OpenMP 디렉티브가 있는 입력 프로그램의 경우 올바른 옵션을 켜면 툴이 올바른지 다시 확인합니다.AutoPar는 기존 툴에 비해 사용자 지식(의미학)을 통합하여 더 많은 병렬화 기회를 발견할 수 있습니다.
iPat/OMP
이 도구는 순차 프로그램의 OpenMP 병렬화에 필요한 지원을 사용자에게 제공합니다.이 도구는 Emacs Editor에서 함수 세트로 구현됩니다.프로그램의 타깃 부분을 선택하고, 지원 명령을 호출하고, 툴이 나타내는 지원 정보에 근거해 프로그램을 수정하는 등 프로그램 병렬화와 관련된 모든 액티비티를 소스 프로그램 에디터 [2]환경에서 처리할 수 있다.
Vienna Fortran 컴파일러 (VFC)
HPF+(HPF의 최적화된 버전)를 위한 새로운 소스 대 소스 병렬화 시스템으로, 불규칙한 애플리케이션의 요건에 대응합니다.
SUIF 컴파일러
SUIF(Stanford University Intermediate Format)는 컴파일러 최적화 및 병렬화에 대한 공동 연구를 지원하기 위해 설계된 무료 인프라입니다.SUIF는 Fortran과 C를 모두 입력 언어로 사용하는 완전 기능 컴파일러입니다.병렬화된 코드는 다양한 [3]아키텍처에서 네이티브 C 컴파일러가 컴파일할 수 있는 프로그램의 SPMD(Single Program Multiple Data) 병렬 C 버전으로 출력됩니다.
Omni OpenMP 컴파일러
OpenMP 플러그마를 사용하는 C 및 Fortran 프로그램을 Omni OpenMP 런타임 라이브러리와 연결된 네이티브 컴파일러를 사용하여 컴파일하기에 적합한 C 코드로 변환합니다.루프 병렬화에는 해당됩니다.
타이밍 아키텍트 옵티마이저
또한 시뮬레이션 기반 접근 방식을 사용하여 작업 할당 및 여러 코어에 대한 작업 병렬화를 개선합니다.시뮬레이션 기반 성능과 실시간 분석을 사용하여 서로 다른 작업 할당 대안을 벤치마킹합니다.의존관계와 프로세서플랫폼 고유의 영향이 고려됩니다.TA Optimizer는 임베디드 시스템엔지니어링에 사용됩니다.
트레이코
반복 공간 슬라이싱 및 자유 일정 프레임워크를 사용합니다.노심은 Presburger 산술과 전이 폐쇄 연산을 기반으로 합니다.루프 의존성은 관계에서 나타납니다.TRACO는 Omega Calculator, CLOG 및 ISL 라이브러리 및 Petit 의존성 분석기를 사용합니다.컴파일러는 C/C++ 어플리케이션의 세밀한 병렬 처리를 통해 보다 나은 로컬리티를 추출합니다.이 도구는 West-Pomeranian University 팀(Bieletki, Palkowski, Klimek 및 기타 저자)에 의해 개발되었습니다.http://traco.sourceforge.net
순서l
Sequence L은 범용 기능 프로그래밍 언어 및 자동 병렬화 도구 세트이며, 주요 설계 목표는 멀티 코어 프로세서 하드웨어의 성능, 프로그래밍의 용이성, 플랫폼의 이식성/최적화 및 코드 명확성과 가독성입니다.그 주된 장점은 프로그래머가 병렬 식별, 벡터화 지정, 레이스 조건 회피 및 수동 지시 기반 프로그래밍 접근의 기타 과제에 신경 쓸 필요 없이 사용 가능한 모든 처리 능력을 자동으로 최대한 활용하는 간단한 코드를 작성할 수 있다는 것입니다.uch를 OpenMP로 합니다.
SequenceL로 작성된 프로그램은 병렬로 실행되는 멀티스레드 코드로 컴파일할 수 있으며, 프로그래머로부터 병렬화 방법 또는 무엇을 지시받지 않습니다.2015년 현재 SequenceL 컴파일러 버전은 C++ 및 OpenCL로 병렬 코드를 생성하며, 이를 통해 C, C++, C#, Fortran, Java 및 Python을 포함한 가장 일반적인 프로그래밍 언어를 사용할 수 있습니다.플랫폼 고유의 런타임은 스레드를 안전하게 관리하여 사용 가능한 코어 수에 따라 병렬 성능을 자동으로 제공합니다.
OMP2MPI
OMPI2MPI[4] OpenMP에서 MPI 소스 코드를 자동으로 생성합니다.클러스터나 Network-on-Chip 기반(NoC 기반) Multiprocessor-System-on-Chip(MPSoC) 등의 비공유 메모리 아키텍처를 이용할 수 있습니다.OMP2MPI는 더 나은 결과를 얻고자 하는 전문가의 추가 최적화를 가능하게 하는 솔루션을 제공합니다.
OMP2HMPP
OMP2HMPP는 [5]고급 C 소스 코드(OpenMP) 코드를 HMPP로 자동 변환하는 도구입니다.생성된 버전은 손으로 코딩된 HMPP 버전과 거의 다를 수 없으며 나중에 손으로 코딩된 CUDA에 의해 향상될 수 있는 113%의 중요한 속도 향상을 제공합니다.
emmtrix 병렬 스튜디오
emtrix Parallel Studio는 emtrix Technologies GmbH가 개발한 인터랙티브 GUI와 결합된 소스 간 병렬화 도구입니다.C, MATLAB, Simulink, Scilab 또는 Xcos 소스 코드를 입력으로 사용하고 출력으로 병렬 C 코드를 생성합니다.정적 스케줄과 병렬 프로그램에 대한 메시지 전달 API에 의존합니다.병렬화 프로세스 전체를 인터랙티브한 GUI로 제어 및 시각화하여 최종 사용자에 의한 병렬화 결정을 가능하게 합니다.GPU 및 FPGA 액셀러레이터를 조합한 임베디드 멀티코어 아키텍처를 대상으로 합니다.
CLOW 컴파일러
CLOW 컴파일러는 클로 플러그마를 사용하는 Fortran 프로그램을 OpenMP 또는 Open으로 증강된 특정 슈퍼컴퓨터 대상에 적합한 Fortran 코드로 변환합니다.ACC 플러그마
PaaS
PaaS는 Unix 쉘 [6]스크립트용 컴파일러를 병렬화하고 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ Vinay G. Vaidya, PushpRaj Agrawal, Aditi Athavale, Anish Sane, Sudhakar Sah 및 Priti Ranadive의 "유발 병렬성을 이용한 멀티코어 프로세서의 병렬성 증가"
- ^ 이시하라 마코토, 혼다 히로키, 사토 미츠히사의 「OpenMP용 인터랙티브 병렬화 지원 툴의 개발·실시」
- ^ Saman P가 1993년 제7회 SIAM 과학컴퓨팅을 위한 병렬처리에 관한 회의의 진행에서 "스케일러블 병렬머신용 SUIF 컴파일러의 개요"아마라싱헤, 제니퍼 MAnderson, Monica S. Lam, Chauwen Tseng
- ^ 알버트 사-가리가, 데이비드 카스텔스-루파스, 조르디 카라비나.2015. OMP2MPI : OpenMPI 프로그램에서 MPI 코드 자동 생성.에너지 효율이 뛰어난 고성능 임베디드 시스템.ACM.
- ^ 알버트 사-가리가, 데이비드 카스텔스-루파스, 조르디 카라비나.2014. OMP2HMPP: Pragma Extensions 프로그램을 통한 HMPP 소스 코드 생성.에너지 효율이 뛰어난 고성능 임베디드 시스템.ACM.
- ^ Zewe, Adam; Technology, Massachusetts Institute of. "Technique significantly boosts the speeds of programs that run in the Unix shell". techxplore.com. Retrieved 2022-06-08.