Vnitřní funkce - Intrinsic function

V počítačovém softwaru , v teorii kompilátoru, vnitřní funkce (nebo vestavěná funkce ) je funkce ( podprogram ) dostupná pro použití v daném programovacím jazyce, jejíž implementaci zpracovává speciálně kompilátor . Typicky může nahradit sekvenci automaticky generovaných instrukcí pro původní volání funkce, podobně jako vložená funkce . Na rozdíl od vložené funkce má kompilátor důvěrné znalosti o vnitřní funkci a může ji tak lépe integrovat a optimalizovat pro danou situaci.

Kompilátory, které implementují vnitřní funkce, je obecně povolují pouze tehdy, když program požaduje optimalizaci , jinak se vrátí k výchozí implementaci poskytované jazykovým runtime systémem (prostředím).

Vnitřní funkce se často používají k explicitní implementaci vektorizace a paralelizace v jazycích, které takové konstrukce neřeší. Některá rozhraní pro programování aplikací (API), například AltiVec a OpenMP , používají vnitřní funkce k deklaraci vektorizovatelných a multiprocesních -aware operací během kompilace. Kompilátor analyzuje vnitřní funkce a převede je na vektorový matematický nebo multiprocesní kód objektu vhodný pro cílovou platformu . Některé vnitřní vlastnosti se používají k poskytnutí dalších omezení optimalizátoru, jako jsou hodnoty, které proměnná nemůže předpokládat.

C a C ++

Kompilátory pro C a C ++ , Microsoft, Intel a GNU Compiler Collection (GCC) implementují vnitřní vlastnosti, které mapují přímo na jednu instrukci x86 , více dat ( SIMD ) ( MMX , Streaming SIMD Extensions (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). Microsoft Visual C ++ kompilátor Microsoft Visual Studio nepodporuje inline sestavy pro x86-64 . Aby se to vykompenzovalo, byly přidány nové vnitřní informace, které mapují standardní montážní instrukce, které nejsou běžně dostupné přes C/C ++, např. Bitové skenování.

Některé kompilátory C a C ++ poskytují nepřenosné vnitřní vlastnosti specifické pro platformu. Jiné vnitřní vlastnosti (například vestavěné moduly GNU ) jsou o něco abstraktnější, přibližují se schopnostem několika současných platforem, s přenosnými záložními implementacemi na platformách bez příslušných pokynů. Je běžné, že C ++ knihoven, jako je GLM nebo Sony je vektor matematických knihoven , pro dosažení přenositelnost přes podmíněný překlad (na základě specifické pro danou platformu pro kompilátor), poskytuje plně přenosné primitiva na vysoké úrovni (například, čtyři-prvek s plovoucí desetinnou čárkou vektorový typ) mapován na příslušné implementace nízkoúrovňového programovacího jazyka , přičemž stále těží ze systému typu C ++ a inliningu; tedy výhoda oproti propojení s ručně psanými soubory objektů sestavení pomocí binárního rozhraní aplikace C (ABI).

Příklady

 uint64_t __rdtsc        ();                                                          // return internal CPU clock counter
 uint64_t __popcnt64     (uint64_t n);                                                // count of bits set in n
 uint64_t _umul128       (uint64_t Factor1, uint64_t Factor2, uint64_t* HighProduct); // 64 bit * 64 bit => 128 bit multiplication
 __m512   _mm512_add_ps  (__m512 a, __m512 b);                                        // calculates a + b for two vectors of 16 floats
 __m512   _mm512_fmadd_ps(__m512 a, __m512 b, __m512 c);                              // calculates a*b + c for three vectors of 16 floats
Odkazy

Jáva

HotSpot Virtual Machine Java ‚s (JVM) just-in-time kompilátor má také Intrinsics pro specifické Java API. Vnitřní vlastnosti hotspotu jsou standardní Java API, která mohou mít na některých platformách jednu nebo více optimalizovaných implementací.

Reference

externí odkazy