MLIR(소프트웨어)
MLIR (software)![]() | |
개발자 | LLVM 개발자 그룹 |
---|---|
작성 위치 | C++ |
운영 체제 | 크로스 플랫폼 |
유형 | 컴파일러 |
웹사이트 | mlir |
MLIR은 컴파일러 [1]개발을 위한 프레임워크입니다.이 프로젝트는 LLVM 생태계에 속하며 [2]방언 개념을 통해 중간 표현을 추상화하는 것을 목표로 합니다.방언은 작업, 유형 및 속성의 집합이며, 그 의미는 도메인별 [3]언어를 나타내도록 모델링될 수 있습니다.
프로젝트의 이름은 다단계 중간 표현을 의미하며, 여기서 다단계 키워드는 여러 방언을 정의하고 기계 코드로 점진적으로 변환할 수 있는 가능성을 나타냅니다.이 기능을 사용하면 더 높은 수준의 추상화 정보를 유지하고 더 정확한 분석 및 변환을 수행할 수 있습니다. 그렇지 않으면 더 낮은 수준의 [4]표현을 처리해야 합니다.
방언
연산은 방언이 구축되는 핵심 요소를 나타냅니다.이들은 이름으로 식별되며, 이는 자신이 속한 방언 내에서 고유해야 하며 선택적인 피연산자, 결과, 속성 및 지역을 가집니다.피연산자와 결과는 정적 단일 할당 양식을 따릅니다.각 결과에는 연관된 유형도 있습니다.속성은 컴파일 시간 지식(예: 상수 값)을 나타냅니다.영역은 블록 목록으로 구성되며, 각 블록에는 입력 인수가 있고 작업 목록이 [5]포함될 수 있습니다.SSA 형태를 중심으로 설계된 방언에도 불구하고 PHI 노드는 이 설계의 일부가 아니며 대신 제어 흐름 [6]연산의 피연산자와 결합하여 블록의 입력 인수로 대체됩니다.
작업의 일반적인 구문은 다음과 같습니다.
%res:2 = "나의 방언."(%입력#3) ({ ^bb0(%arg0: !나의 방언<"custom_type"> loc("mysource.cc ":10:8)): 중첩 작업 }) { 몇개.기여하다 = 진실의, 기타_세부적인 = 1.5 } : (!나의 방언<"custom_type">) -> (!나의 방언<"other_type">, !나의 방언<"other_type">) loc(콜 사이트("foo" 에 "mysource.cc ":10:8))
이 예제는 morph라는 이름의 연산을 보여주며, mydialect 방언에 속하며, 하나의 입력 피연산자를 취하고 두 개의 결과를 생성합니다.입력 인수에는 custom_type이라는 연결된 유형이 있고 결과에는 둘 다 other_type이 있으며 두 유형 모두 mydialect 방언에 다시 속합니다.이 작업에는 some.attribute 및 other_attribute라는 두 개의 연결된 특성과 하나의 블록을 포함하는 영역도 있습니다.마지막으로 키워드를 사용하여 위치가 디버깅 목적으로 [7]첨부됩니다.
작업 [8]정의 내에서 적절한 구문 분석 및 인쇄 기능을 구현하여 사용자 선호도에 따라 작업, 유형 및 속성의 구문을 사용자 정의할 수도 있습니다.
핵심 방언
MLIR 방언 생태계는 개방적이고 확장 가능하며, 이는 최종 사용자가 필요한 의미를 캡처하여 새로운 방언을 자유롭게 만들 수 있음을 의미합니다.그러나 MLIR의 코드베이스는 이미 다양한 종류의 방언을 최종 사용자가 사용할 수 있도록 합니다.각각은 중간 표현 내에서 종종 나타나는 특정 측면을 다루는 것을 목표로 하지만, 자체적인 방식으로 수행합니다.예를 들어, arith 방언은 정수 및 부동 소수점 값에 대한 간단한 수학적 연산을 보유하는 반면 memref 방언은 메모리 [9]관리를 위한 연산을 보유합니다.
다음 코드는 두 부동소수점 행렬을 사용하고 동일한 위치에 있는 값 사이의 합을 수행하는 함수를 정의합니다.
func.func @filename_add(%arg0: memref<10x20filename32>, %arg1: memref<10x20filename32>) -> memref<10x20filename32> {%result = memref.alloc(alloc): memref<10x20()32> 아핀.%i = 0 ~ 10 {아핀}에 대해.%j = 0 ~ 20 { %lhs = memref.load %arg0[%i, %j] : memref<10x20px32> %rhs = memref.load %[%i, %j] : memref<10x20px32> %sum = %sum ▁ar %lhs, %rhs : %rhs : %[%i, %rhs:32memref:32memref] funref20px32} funcult <10x32> memref32
같은 결과를 얻기 위해 다른 방언이 사용될 수 있으며, 각각의 방언은 다른 수준의 추상화를 의미할 수 있습니다.이 예에서 아핀 방언은 다면체 컴파일에 [9]대한 기존 분석 및 최적화를 재사용하기 위해 선택되었습니다.
관련 핵심 방언 중 하나는 LLVM입니다.LLVM-IR의 일대일 맵(LLVM에서 사용하는 중간 표현)을 제공하여 머신 코드 [10]생성을 포함한 모든 미들 엔드 및 백엔드 변환을 재사용할 수 있도록 하는 것이 목적입니다.
작업 정의 규격
사투리의 동작은 C++ 언어를 사용하여 정의할 수 있지만, 동작 정의 사양(ODS)[11]을 사용하여 보다 편리하고 강력한 방식으로 정의할 수도 있습니다.TableGen을 사용하면 선언 및 정의에 대한 C++ 코드를 자동으로 [12]생성할 수 있습니다.
자동 생성된 코드에는 원하는 텍스트 표현의 구조를 매핑하는 간단한 문자열을 기반으로 하는 구문 분석 및 인쇄 방법과 필드에 액세스하고 각 작업, 표준화 또는 [13]접기의 의미 검증과 같은 일반적인 작업을 수행하는 모든 상용 코드가 포함됩니다.
방언을 [13]구성하는 요소의 다른 두 범주인 유형 및 속성에도 동일한 선언 메커니즘을 사용할 수 있습니다.
다음 예제는 가변 피연산자 수와 0개의 결과를 생성하는 작업의 어셈블리 형식을 지정하는 방법을 보여줍니다.텍스트 표현은 선택적 속성 목록에 포함된 다음 피연산자,[11] 콜론 및 피연산자 유형의 선택적 목록으로 구성됩니다.
허락하다 어셈블리 형식 = "attr-operands ($operands^ ':' type "operands")?";
변환
변환은 항상 내장된 조정 메커니즘에 의존하지 않고 IR에서 직접 수행할 수 있습니다.그러나 구현과 유지보수를 모두 용이하게 하기 위해 MLIR는 IR 재작성을 위한 인프라를 제공합니다. 이며, 이는 서로 다른 재작성 드라이버로 구성됩니다.각 드라이버는 패턴이라는 이름의 개체 집합을 수신하며, 각 개체는 특정 속성과 작업을 일치시키는 고유한 내부 논리를 가집니다.연산이 일치하면 다시 쓰기 프로세스가 수행되고 패턴 [14]내 로직에 따라 IR이 수정됩니다.
사투리 변환 드라이버
이 드라이버는 기존 작업의 합법성에 따라 작동합니다. 즉, 드라이버는 어떤 작업이 불법으로 간주되어야 하는지 결정하는 일련의 규칙을 받고 패턴이 일치하고 이를 합법적인 작업으로 변환할 것으로 예상합니다.이러한 규칙 뒤의 논리는 임의로 복잡할 수 있습니다. 즉, 작업이 속한 방언을 기반으로 할 수도 있지만 속성이나 중첩된 [15]작업과 같은 보다 구체적인 속성을 검사할 수도 있습니다.
이름에서 알 수 있듯이 이 드라이버는 일반적으로 다른 언어에 속하는 작업에서 사투리의 연산을 변환하는 데 사용됩니다.이 시나리오에서는 전체 소스 방언이 불법으로 표시되고 대상 방언이 합법으로 표시되며 소스 방언 작업에 대한 패턴이 제공됩니다.또한 방언 변환 프레임워크는 피연산자와 결과에 대해 수행해야 하는 유형 변환을 지원하며, 이를 대상 [15]방언의 유형 시스템으로 변환합니다.
MLIR을 사용하면 여러 변환 경로를 사용할 수 있습니다.행렬의 합에 대한 예제를 고려할 때, 가능한 감소 전략은 scf 방언에 속하는 for-loop을 생성하여 CPU에서 실행할 코드를 얻는 것일 수 있습니다.
#map = affine_map<(d0, d1) -> (d0, d1)> 모듈 {func.func @avg(%arg0: memref<10x20px32>, %arg1: memref<10x20px32>) -> memref<10x20px32> {%alloc = memref.alloc(alloc) : memref <10x20(10x20) 32> %c0 = arith.dll 0 : 인덱스 %c10 = arith.dll 10 : 인덱스 %c1 = arith.dll 1 : 인덱스 scf.%arg2 = %c0 ~ %c10 단계 %c1 { %c0_0 = arith.dll 0 : 인덱스 %c20 = arith.dll 20 : 인덱스 %c1_1 = arith.dll 1 : 인덱스 scf.%arg3 = %c0_0 ~ %c20 단계 %c1_1 { %0 = memref.load %arg0[%arg2, %arg3] : memref<10x20"load %arg1[%arg2, %arg3] : memref<10x20"load %arg1"[%arg2, %arg3] : memref<10x20"10x32>%f.distore %g2"0, %lotorg2"0,"memallocolotorg2"0,%arg3] : memref<10x20xf32> } } 반환 %alloc : memref<10x20xf32> } }
그러나 다른 가능한 전략은 GPU를 위한 코드를 생성하기 위해 GPU 방언을 사용하는 것일 수 있습니다.
#map = affine_map<(d0, d1) -> (d0, d1)> 모듈 {func.func @avg(%arg0: memref<10x20px32>, %arg1: memref<10x20px32>) -> memref<10x20px32> {%alloc = memref.alloc(alloc): memref<10x20°32> %c0 = arith.dll 0 : 인덱스 %c10 = arith.dll 10 : 인덱스 %c1 = arith.dll 1 : 인덱스 %c20 = arith.dll 20 : 인덱스 %c20 = arith.subi20 : 인덱스 %c0 : arith arith arith 1 : arith1 arith arith arith 1 : 1 : 1 arith.dulith 1 arith 1 arith.1 arith.1.발사 블록(%arg2,%arg3, %arg4)의 (%arg8 = %0, %arg9 = %c1_2, %arg10 = %c1_2) 스레드(%arg5, %arg6, %arg7)의 (%arg11 = %1, %arg12 = %c1_2, %arg13 = %c1_2)의 %2 = ar.adddi, %arg2: %arg4 = %arg4 arg3 arg4 = %gmemload add %,%3] : memref<10x20px32> %6 = arith.addf %4,%5 : f32 memref.store %4, %alloc[%2, %3] : memref<10x20x32> gpu.terminator } 반환 %alloc : memref<10x20x32> }
그리디 패턴 다시 쓰기 드라이버
운전자는 고정 지점에 도달하거나 최대 반복 횟수에 도달할 때까지 제공된 패턴을 유익성에 따라 탐욕스럽게 적용합니다.패턴의 이점은 자체적으로 발생합니다.동일한 경우 패턴 리스트 내의 상대 순서가 [14]사용됩니다.
특성 및 인터페이스
MLIR은 특성과 인터페이스를 통해 기존 최적화(예: 공통 하위 표현 제거, 루프 불변 코드 모션)를 사용자 지정 방언에 적용할 수 있습니다.이 두 가지 메커니즘을 통해 변환 패스는 특성이나 인터페이스가 [16][17]제공하는 일부 속성에만 의존하여 실제 구현을 알지 못한 채 운영에 대해 작동할 수 있습니다.
특성은 추가적인 구현을 요구하지 않고 운영에 연결되어야 합니다.이들의 목적은 작업이 특정 속성(예: 정확히 두 개의 피연산자)[16]을 만족한다는 것을 나타내는 것입니다.대신 인터페이스는 동일한 종류의 작업 인스턴스 간에 값이 변경될 수 있는 특정 측면에 대해 작업을 쿼리할 수 있는 보다 강력한 도구를 나타냅니다.인터페이스의 예는 메모리 효과의 표현입니다. 메모리에서 작동하는 각 작업은 이러한 인터페이스를 연결할 수 있지만 실제 효과는 실제 피연산자(예: 상수 또는 [17]메모리에 대한 참조일 수 있는 인수를 가진 함수 호출)에 따라 달라질 수 있습니다.
적용들
중간 표현을 자유롭게 모델링할 수 있기 때문에 MLIR를 광범위한 시나리오에서 사용할 수 있습니다.여기에는 전통적인 프로그래밍[18] 언어뿐만 아니라 고급 합성[19][20], 양자[21] 컴퓨팅 및 암호화도[22][23] 포함됩니다.기계 학습 애플리케이션은 또한 병렬 [24][25][26][27][28]아키텍처를 대상으로 하는 방언과 함께 내장된 다면체 컴파일 기술을 활용합니다.
참고 항목
레퍼런스
- ^ Aho, Alfred V.; Sethi, Ravi; Ullman, Jeffrey D. (2002). Compilers: principles, techniques, and tools. Addison-Wesley series in computer science (Reprinted, with corr., [36. Druck] ed.). Reading, Mass.: Addison-Wesley. ISBN 978-0-201-10088-4.
- ^ Lattner, Chris; Amini, Mehdi; Bondhugula, Uday; Cohen, Albert; Davis, Andy; Pienaar, Jacques; Riddle, River; Shpeisman, Tatiana; Vasilache, Nicolas; Zinenko, Oleksandr (2021). MLIR: Scaling Compiler Infrastructure for Domain Specific Computation. pp. 2–14. doi:10.1109/CGO51591.2021.9370308.
- ^ Mernik, Marjan; Heering, Jan; Sloane, Anthony M. (December 2005). "When and how to develop domain-specific languages". ACM Computing Surveys. 37 (4): 316–344. doi:10.1145/1118890.1118892. ISSN 0360-0300. S2CID 207158373.
- ^ Seidl, Helmut; Wilhelm, Reinhard; Hack, Sebastian (2012). Compiler design: analysis and transformation. Berlin New York: Springer. ISBN 978-3-642-17548-0.
- ^ "MLIR Language Reference - MLIR". mlir.llvm.org. Retrieved 2023-07-05.
- ^ "MLIR Rationale - MLIR". mlir.llvm.org. Retrieved 2023-07-05.
- ^ Mehdi, Amini; River, Riddle. "MLIR Tutorial" (PDF).
- ^ Stroustrup, Bjarne (2015). The C++ programming language: C++ 11 (4. ed., 4. print ed.). Upper Saddle River, NJ: Addison-Wesley. ISBN 978-0-321-56384-2.
- ^ a b "Dialects - MLIR". mlir.llvm.org. Retrieved 2023-07-07.
- ^ "LLVM Language Reference Manual — LLVM 17.0.0git documentation". llvm.org. Retrieved 2023-07-05.
- ^ a b "Operation Definition Specification (ODS) - MLIR". mlir.llvm.org. Retrieved 2023-07-05.
- ^ "TableGen Overview — LLVM 17.0.0git documentation". llvm.org. Retrieved 2023-07-05.
- ^ a b "Defining Dialects - MLIR". mlir.llvm.org. Retrieved 2023-07-07.
- ^ a b "Pattern Rewriting : Generic DAG-to-DAG Rewriting - MLIR". mlir.llvm.org. Retrieved 2023-07-06.
- ^ a b "Dialect Conversion - MLIR". mlir.llvm.org. Retrieved 2023-07-06.
- ^ a b "Traits - MLIR". mlir.llvm.org. Retrieved 2023-07-05.
- ^ a b "Interfaces - MLIR". mlir.llvm.org. Retrieved 2023-07-05.
- ^ Moses, William S.; Chelini, Lorenzo; Zhao, Ruizhe; Zinenko, Oleksandr (2021). Polygeist: Raising C to Polyhedral MLIR. 30th International Conference on Parallel Architectures and Compilation Techniques (PACT). pp. 45–59. doi:10.1109/PACT52795.2021.00011. ISBN 978-1-6654-4278-7.
- ^ Agostini, Nicolas Bohm; Curzel, Serena; Amatya, Vinay; Tan, Cheng; Minutoli, Marco; Castellana, Vito Giovanni; Manzano, Joseph; Kaeli, David; Tumeo, Antonino (2022-10-30). "An MLIR-based Compiler Flow for System-Level Design and Hardware Acceleration". Proceedings of the 41st IEEE/ACM International Conference on Computer-Aided Design. Association for Computing Machinery. p. 1–9. doi:10.1145/3508352.3549424. ISBN 978-1-4503-9217-4.
- ^ Ruizhe, Zhao; Jianyi, Cheng (2021). "Phism: Polyhedral High-Level Synthesis in MLIR". arXiv:2103.15103 [cs.PL].
- ^ McCaskey, Alexander; Nguyen, Thien (October 2021). A MLIR Dialect for Quantum Assembly Languages. IEEE. pp. 255–264. arXiv:2101.11365. doi:10.1109/QCE52317.2021.00043. ISBN 978-1-6654-1691-7. S2CID 231718965.
- ^ Park, Sunjae; Song, Woosung; Nam, Seunghyeon; Kim, Hyeongyu; Shin, Junbum; Lee, Juneyoung (2023-06-06). "HEaaN.MLIR: An Optimizing Compiler for Fast Ring-Based Homomorphic Encryption". Proceedings of the ACM on Programming Languages. 7 (PLDI): 196–220. doi:10.1145/3591228. ISSN 2475-1421.
- ^ Govindarajan, Sanath; Moses, William S. "SyFER-MLIR: Integrating Fully Homomorphic Encryption Into the MLIR Compiler Framework" (PDF).
- ^ Jin, Tian; Bercea, Gheorghe-Teodor; Le, Tung D.; Chen, Tong; Su, Gong; Imai, Haruki; Negishi, Yasushi; Leu, Anh; O'Brien, Kevin; Kawachiya, Kiyokuni; Eichenberger, Alexandre E. (2020). "Compiling ONNX Neural Network Models Using MLIR". arXiv:2008.08272 [cs.PL].
- ^ Pienaar, Jacques (2020), MLIR in TensorFlow Ecosystem, retrieved 2023-07-06
- ^ Hu, Pengchao; Lu, Man; Wang, Lei; Jiang, Guoyue (2022). "TPU-MLIR: A Compiler For TPU Using MLIR". arXiv:2210.15016 [cs.PL].
- ^ Katel, Navdeep; Khandelwal, Vivek; Bondhugula, Uday (2022-03-19). MLIR-based code generation for GPU tensor cores. ACM. pp. 117–128. doi:10.1145/3497776.3517770. ISBN 978-1-4503-9183-2. S2CID 247522110.
- ^ Bik, Aart; Koanantakool, Penporn; Shpeisman, Tatiana; Vasilache, Nicolas; Zheng, Bixia; Kjolstad, Fredrik (2022-12-31). "Compiler Support for Sparse Tensor Computations in MLIR". ACM Transactions on Architecture and Code Optimization. 19 (4): 1–25. doi:10.1145/3544559. ISSN 1544-3566. S2CID 246680261.