Funkcja wewnętrzna - Intrinsic function

W oprogramowaniu komputerowym , w teorii kompilatora, funkcja wewnętrzna (lub funkcja wbudowana ) jest funkcją ( podprogramem ) dostępną do użycia w danym języku programowania, której implementacją zajmuje się specjalnie kompilator . Zazwyczaj może zastąpić sekwencję automatycznie generowanych instrukcji dla oryginalnego wywołania funkcji, podobnie jak funkcja inline . W przeciwieństwie do funkcji wbudowanej, kompilator ma dokładną wiedzę na temat funkcji wewnętrznej, dzięki czemu może lepiej zintegrować ją i zoptymalizować w danej sytuacji.

Kompilatory, które implementują wewnętrzne funkcje, generalnie włączają je tylko wtedy, gdy program żąda optymalizacji , w przeciwnym razie wracają do domyślnej implementacji zapewnianej przez system środowiska uruchomieniowego języka (środowisko).

Funkcje wewnętrzne są często używane do jawnej implementacji wektoryzacji i zrównoleglania w językach, które nie dotyczą takich konstrukcji. Niektóre interfejsy programowania aplikacji (API), na przykład AltiVec i OpenMP , używają wewnętrznych funkcji do deklarowania, odpowiednio, operacji wektoryzowalnych i uwzględniających wieloprocesorowość podczas kompilacji. Kompilator analizuje wewnętrzne funkcje i konwertuje je na wektor matematyczny lub wieloprocesowy kod obiektowy odpowiedni dla platformy docelowej . Niektóre elementy wewnętrzne służą do zapewnienia optymalizatorowi dodatkowych ograniczeń, takich jak wartości, których zmienna nie może przyjąć.

C i C++

Kompilatory dla C i C++ firmy Microsoft, Intel i GNU Compiler Collection (GCC) implementują elementy wewnętrzne, które mapują bezpośrednio do instrukcji x86 pojedynczej instrukcji, wielu danych ( SIMD ) ( MMX , Streaming SIMD Extensions (SSE), SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , ...). Microsoft Visual C ++ kompilator Visual Studio nie obsługuje inline montażu dla x86-64 . Aby to zrekompensować, dodano nowe funkcje wewnętrzne, które mapują standardowe instrukcje asemblacji, które nie są normalnie dostępne przez C/C++, np. skanowanie bitów.

Niektóre kompilatory C i C++ dostarczają nieprzenośnych elementów wewnętrznych specyficznych dla platformy. Inne intrinsics (takie jak GNU wbudowanym ins) są nieco bardziej oderwane, zbliżenie zdolności kilku współczesnych platform, z przenośnych cofać implementacji na platformach z braku odpowiednich instrukcji. To jest wspólne dla bibliotek C ++, takich jak GLM lub Sony „s matematyki wektorowe bibliotekach , w celu osiągnięcia przenoszenia poprzez kompilacji warunkowej (na podstawie flagi platforma specyficzny kompilatora), zapewniając w pełni przenośne prymitywy wysokiego poziomu (np czterech elementów zmiennoprzecinkowych typ wektorowy) odwzorowany na odpowiednie implementacje języka programowania niskiego poziomu , przy jednoczesnym korzystaniu z systemu typów C++ i inliningu; stąd przewaga nad linkowaniem do ręcznie napisanych plików obiektowych asemblera za pomocą interfejsu binarnego aplikacji C (ABI).

Przykłady

 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
Spinki do mankietów

Jawa

HotSpot maszyna wirtualna Java „s (JVM) just-in-time kompilator posiada również intrinsics dla określonych interfejsów API Javy. Funkcje wewnętrzne Hotspot to standardowe interfejsy API Java, które mogą mieć jedną lub więcej zoptymalizowanych implementacji na niektórych platformach.

Bibliografia

Zewnętrzne linki