고유함수

Intrinsic function

컴퓨터 소프트웨어에서, 컴파일러 이론에서, 내장 함수 또는 내장 함수(built-in function)라고도 불리는 고유 함수는 컴파일러에 의해 구현이 특별히 처리되는 주어진 프로그래밍 언어에서 사용할 수 있는 함수(서브루틴)입니다. 일반적으로 인라인 함수와 유사하게 자동으로 생성된 명령어 시퀀스를 원래 함수 호출에 대체할 수 있습니다.[1] 인라인 함수와 달리 컴파일러는 고유 함수에 대한 깊은 지식을 가지고 있으므로 주어진 상황에 맞게 더 잘 통합하고 최적화할 수 있습니다.

고유 기능을 구현하는 컴파일러는 프로그램이 최적화를 요청할 때만 활성화할 수 있으며, 그렇지 않으면 언어 런타임 시스템(환경)이 제공하는 기본 구현으로 되돌아갈 수 있습니다.

벡터화 및 병렬화

고유 함수는 종종 그러한 구조를 다루지 않는 언어에서 벡터화병렬화를 명시적으로 구현하는 데 사용됩니다. 일부 응용 프로그램 프로그래밍 인터페이스(API), 예를 들어 AltiVecOpenMP는 컴파일 중에 벡터화 및 다중 처리 인식 작업을 각각 선언하기 위해 고유 함수를 사용합니다. 컴파일러는 고유 함수를 파싱하여 대상 플랫폼에 적합한 벡터 수학 또는 다중 처리 객체 코드로 변환합니다. 변수가 가정할 수 없는 값과 같이 일부 고유 함수를 사용하여 최적화기에 추가 제약 조건을 제공합니다.[2]

프로그래밍 언어별

C와 C++

마이크로소프트,[3] 인텔 [1]GNU 컴파일러 모음(GCC)[4]의 C 및 C++용 컴파일러는 x86 단일 명령어, 다중 데이터(SIMD) 명령어(MMX, 스트리밍 SIMD 확장(SSE), SSE2, SSE3, SSE3, SSE4, AVX, AVX2, AVX512, FMA, ...)에 직접 매핑되는 고유 특성을 구현합니다. Microsoft Visual StudioMicrosoft Visual C++ 컴파일러는 x86-64용 인라인 어셈블리를 지원하지 않습니다.[5][6][7][8] 이를 보완하기 위해 C/C++를 통해 일반적으로 접근할 수 없는 표준 어셈블리 명령어(예: 비트 스캔)에 매핑하는 새로운 고유 기능이 추가되었습니다.

일부 C 및 C++ 컴파일러는 비휴대용 플랫폼 고유의 특성을 제공합니다. 다른 고유한 요소(예: GNU 내장)는 약간 더 추상화되어 적절한 지침 없이 플랫폼에 휴대용 폴백 구현이 가능한 여러 현대 플랫폼의 능력을 대략적으로 보여줍니다.[9] GLM이나 소니벡터 수학 라이브러리와 같은 [10]C++ 라이브러리는 조건부 컴파일(플랫폼별 컴파일러 플래그 기반)을 통해 휴대성을 달성하는 것이 일반적이며, 적절한 저수준 프로그래밍 언어 구현에 매핑된 완전한 휴대성 높은 수준의 프리미티브(예: 4요소 부동 소수점 벡터 유형)를 제공합니다. C++ 타입 시스템과 인라인의 이점을 여전히 누릴 수 있습니다. 따라서 C 애플리케이션 바이너리 인터페이스(ABI)를 사용하여 손으로 작성된 어셈블리 객체 파일에 링크하는 것보다 이점이 있습니다.

 uint64_t __rdtsc        ();                                                          // 내부 CPU 클럭 카운터 반환  uint64_t __popcnt64     (uint64_t n);                                                // n으로 설정된 비트 수  uint64_t _umul128       (uint64_t 인자1, uint64_t 인자2, uint64_t* 하이 프로덕트); // 64비트 * 64비트 => 128비트 곱셈  __m   _mm 512_add_ps  (__m a, __m b);                                        // 16개 플로트의 두 벡터에 대해 a + b를 계산합니다.  __m   _mm512_fmadd_ps(__m a, __m b, __m c);                              // 16개 플로트의 3개 벡터에 대해 a*b + c를 계산합니다. 

링크스

자바

HotSpot Java 가상 머신(JVM)의 Just-in-time 컴파일러는 특정 Java API에 대한 고유한 특성도 가지고 있습니다.[11] 핫스팟 고유성은 표준 Java API로 일부 플랫폼에서 하나 이상의 최적화된 구현을 가질 수 있습니다.

PL/I

ANSI/ISO PL/I는 거의 90개의 내장 기능을 정의합니다.[12] 이들은 일반적으로 다음과 같이 그룹화됩니다.[13]: 337–338

  • INDEX, LENGTH와 같은 기능에 내장된 문자열 처리
  • ABS, CYELE, ROUND 등의 함수에 내장된 산술
  • SIN, COS, LOG, ERF와 같은 수학적 내장 함수
  • 어레이 핸들링 내장 기능(예: ANY, ALL, PROD)
  • ONCODE, ONFILE과 같은 기능이 내장된 상태 처리
  • 스토리지 컨트롤 내장 기능(예: ADDR, POINTER)
  • 입출력 빌트인: LINENO
  • DATE 및 TIME과 같은 기타 내장 기능

개별 컴파일러는 머신 아키텍처 또는 운영 체제에 특화된 추가 내장 기능을 추가했습니다.

기본 제공 기능은 이름을 선언하지 않은 채로 두고 선언함으로써 기본 제공 기능을 식별합니다. BUILTIN. 동일한 이름의 사용자 제공 기능은 다음과 같이 선언하여 대체할 수 있습니다. ENTRY.

참고문헌

  1. ^ a b "Intel® C++ Compiler 19.1 Developer Guide and Reference". Intel® C++ Compiler Documentation. 16 December 2019. Retrieved 2020-01-17.
  2. ^ The Clang Team (2020). "Clang Language Extensions". Clang 11 documentation. Retrieved 2020-01-17. Builtin Functions
  3. ^ MSDN. "Compiler Intrinsics". Microsoft. Retrieved 2012-06-20.
  4. ^ GCC documentation. "Built-in Functions Specific to Particular Target Machines". Free Software Foundation. Retrieved 2012-06-20.
  5. ^ MSDN. "Intrinsics and Inline Assembly". Microsoft. Archived from the original on 2018-01-02. Retrieved 2010-04-16.
  6. ^ MSDN. "Intrinsics and Inline Assembly". Microsoft. Retrieved 2011-09-28.
  7. ^ MSDN. "Intrinsics and Inline Assembly". Microsoft. Retrieved 2011-09-28.
  8. ^ MSDN. "Intrinsics and Inline Assembly". Microsoft. Retrieved 2011-09-28.
  9. ^ "Vector Extensions". Using the GNU Compiler Collection (GCC). Retrieved 2020-01-16.
  10. ^ "Sony open sources Vector Math and SIMD math libraries (Cell PPU/SPU/other platforms)". Beyond3D Forum. Retrieved 2020-01-17.
  11. ^ Mok, Kris (25 February 2013). "Intrinsic Methods in HotSpot VM". Slideshare. Retrieved 2014-12-20.
  12. ^ ANSI X3 Committee (1976). American National Standard programming language PL/I.{{cite book}}: CS1 main: 숫자 이름: 저자 목록 (링크)
  13. ^ IBM Corporation (1995). IBM PL/I for MVS & VM Language Reference.

외부 링크