Funzione intrinseca

La funzione intrinseca[1][2] (dal latino intrinsĕcus) nel software per computer, nella teoria del compilatore, una funzione intrinseca (o funzione incorporata) è una funzione (subroutine) disponibile per l'uso in un determinato linguaggio di programmazione la cui implementazione è gestita appositamente dal compilatore. In genere, può sostituire una sequenza di istruzioni generate automaticamente per la chiamata della funzione originale, simile a una funzione in linea. A differenza di una funzione inline, il compilatore ha una conoscenza intima di una funzione intrinseca e può quindi integrarla e ottimizzarla meglio per una data situazione.

I compilatori che implementano funzioni intrinseche generalmente li abilitano solo quando un programma richiede l'ottimizzazione, altrimenti ricade su un'implementazione predefinita fornita dal sistema di runtime della lingua (ambiente).

Le funzioni intrinseche sono spesso utilizzate per implementare esplicitamente la vettorizzazione e la parallelizzazione in linguaggi che non affrontano tali costrutti. Alcune API (application programming interfaces), ad esempio AltiVec e OpenMP, utilizzano funzioni intrinseche per dichiarare, rispettivamente, operazioni vectorizable e multiprocessing -aware durante la compilazione. Il compilatore analizza le funzioni intrinseche e le converte in codice matematico vettoriale o codice multiprocessing appropriato per la piattaforma di destinazione.

C e C ++

modifica

I compilatori per C e C++, di Microsoft[3], Intel e GNU Compiler Collection (GCC)[4] implementano intrinseche che si associano direttamente alle istruzioni x86 single instruction, multiple data (SIMD) (MMX, Streaming SIMD Extensions (SSE)), SSE2, SSE3, SSSE3, SSE4). Il compilatore Microsoft Visual C++ di Microsoft Visual Studio non supporta l'assembly inline per x86-64. Per compensare ciò, sono stati aggiunti nuovi elementi intrinseci che mappano le istruzioni di assemblaggio standard che normalmente non sono accessibili tramite C / C++, ad esempio, bit scan.

Alcuni compilatori C e C++ forniscono elementi intrinseci specifici della piattaforma non portatili. Altre intrinseche (come i GNU built-in) sono leggermente più astratte, approssimando le capacità di molte piattaforme contemporanee, con implementazioni fallback portatili su piattaforme senza istruzioni appropriate. È comune per le librerie C++, come glm o le librerie matematiche vettoriali di Sony[5], per ottenere la portabilità tramite la compilazione condizionale (basata su flag di compilatori specifici della piattaforma), fornendo primitive di alto livello completamente portatili (ad esempio un quattro elementi tipo di vettore a virgola mobile) mappato sulle appropriate implementazioni del linguaggio di programmazione di basso livello, pur continuando a beneficiare del sistema di tipo C ++ e dell'inlinazione; da qui il vantaggio rispetto al collegamento a file di oggetti di assemblaggio scritti a mano, utilizzando l'interfaccia binaria di applicazioni C (ABI).

Esempio

modifica
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

Il compilatore just-in-time della macchina virtuale Java HotSpot (JVM) ha anche caratteristiche intrinseche per specifiche API Java[6]. Intrinseci degli hotspot sono API Java standard che possono avere una o più implementazioni ottimizzate su alcune piattaforme.

  1. ^ Enrico Pedemonte, Fondamenti di struttura, proprietà e tecnologia dei polimeri, Edizioni Nuova Cultura, 2011, ISBN 9788861347229. URL consultato il 19 maggio 2018.
  2. ^ Che cos'è una funzione intrinseca in informatica?, su math.unipd.it. URL consultato il 19 maggio 2018.
  3. ^ Compiler intrinsics, su msdn.microsoft.com.
  4. ^ gcc.gnu.org, https://gcc.gnu.org/onlinedocs/gcc/Target-Builtins.html.
  5. ^ Copia archiviata, su forum.beyond3d.com. URL consultato il 18 aprile 2018 (archiviato dall'url originale il 24 giugno 2016).
  6. ^ slideshare.net, https://www.slideshare.net/RednaxelaFX/green-teajug-hotspotintrinsics02232013.

Collegamenti esterni

modifica