Article de reference

Fonction intrinsèque

En informatique , et plus précisément en théorie des compilateurs , une fonction intrinsèque , également appelée fonction intégrée , est une fonction ( sous-programme ) disponib...

informatique , et plus précisément en théorie des compilateurs , une fonction intrinsèque , également appelée fonction intégrée , est une fonction ( sous-programme ) disponible dans un langage de programmation donné et dont l'implémentation est gérée spécifiquement par le compilateur . Elle peut généralement remplacer l'appel de fonction original par une séquence d' instructions générées automatiquement, à l'instar d'une fonction en ligne . Contrairement à une fonction en ligne, le compilateur possède une connaissance approfondie d'une fonction intrinsèque et peut ainsi mieux l'intégrer et l'optimiser pour une situation donnée.

Les compilateurs qui implémentent des fonctions intrinsèques ne peuvent les activer que lorsqu'un programme demande une optimisation , sinon ils utilisent une implémentation par défaut fournie par le système d'exécution du langage (environnement).

la vectorisation et la parallélisation dans les langages qui ne prennent pas en charge ces constructions. Certaines interfaces de programmation (API), comme AltiVec et OpenMP , utilisent des fonctions intrinsèques pour déclarer, respectivement, les opérations vectorisables et compatibles avec le multiprocesseur lors de la compilation. Le compilateur analyse les fonctions intrinsèques et les convertit en code objet vectoriel ou multiprocesseur adapté à la plateforme cible . Certaines fonctions intrinsèques servent à fournir des contraintes supplémentaires à l'optimiseur, telles que les valeurs qu'une variable ne peut pas prendre.

Par langage de programmation

C et C++

Les compilateurs C et C++ de Microsoft , Intel et GCC implémentent des fonctions intrinsèques qui correspondent directement aux instructions SIMD x86 ( MMX , SSE, SSE2 , SSE3 , SSSE3 , SSE4 , AVX , AVX2 , AVX512 , FMA , etc.). Ces fonctions intrinsèques permettent d'effectuer des opérations sur des instructions assembleur standard normalement inaccessibles via C/C++, comme le balayage de bits et les opérations parallèles sur 128 et 256 bits .

Certains compilateurs C et C++ fournissent des fonctions intrinsèques non portables et spécifiques à la plateforme. D'autres fonctions intrinsèques (telles que les fonctions intégrées GNU ) sont légèrement plus abstraites, approximant les capacités de plusieurs plateformes contemporaines, avec des implémentations de repli portables sur les plateformes dépourvues d'instructions appropriées. Il est courant que les bibliothèques C++, telles que glm ou les bibliothèques de calcul vectoriel de Sony , assurent la portabilité grâce à la compilation conditionnelle (basée sur des options de compilation spécifiques à la plateforme), fournissant des primitives de haut niveau entièrement portables (par exemple, un type vectoriel à virgule flottante à quatre éléments) mappées sur les implémentations appropriées du langage de programmation de bas niveau , tout en bénéficiant du système de types C++ et de l'inlining ; d'où l'avantage par rapport à la liaison à des fichiers objets assembleur écrits manuellement, utilisant l' ABI C.

Exemples

Voici des exemples de signatures de fonctions intrinsèques issues de l'ensemble de fonctions intrinsèques d'Intel.

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 "
uint64_t __rdtsc (); // retourne le compteur d'horloge interne du processeur uint64_t __popcnt64 ( uint64_t n ); // nombre de bits à 1 dans n uint64_t _umul128 ( uint64_t Factor1 , uint64_t Factor2 , uint64_t * HighProduct ); // multiplication 64 bits * 64 bits => 128 bits __m512 _mm512_add_ps ( __m512 a , __m512 b ); // calcule a + b pour deux vecteurs de 16 nombres flottants __m512 _mm512_fmadd_ps ( __m512 a , __m512 b , __m512 c ); // calcule a * b + c pour trois vecteurs de 16 nombres flottants

COBOL

Le module de fonction intrinsèque pour COBOL a été introduit dans ANSI INCITS X3.23a-1989 et ISO 1989:1985/Amd 1:1992.

Java

Le compilateur JIT (Just-In-Time ) de la machine virtuelle Java (JVM) HotSpot possède également des intrinsèques pour des API Java spécifiques. Les intrinsèques HotSpot sont des API Java standard qui peuvent avoir une ou plusieurs implémentations optimisées sur certaines plateformes.

PL/I

La norme ANSI/ISO PL/I définit près de 90 fonctions intégrées. Celles-ci sont conventionnellement regroupées comme suit :

  • Fonctions intégrées de manipulation de chaînes de caractères telles que INDEX, LENGTH
  • Fonctions arithmétiques intégrées telles que ABS, CEIL, ROUND
  • Fonctions mathématiques intégrées telles que SIN, COS, LOG, ERF
  • Fonctions intégrées de gestion de tableaux, par exemple ANY, ALL, PROD
  • Fonctions intégrées de gestion des conditions telles que ONCODE, ONFILE
  • Fonctions intégrées de Storage Control, par exemple ADDR, POINTER
  • Fonctions d'entrée/sortie intégrées : N° DE LIGNE
  • Diverses fonctions intégrées telles que DATE et HEURE

Certains compilateurs ont ajouté des fonctions intégrées supplémentaires spécifiques à une architecture machine ou à un système d'exploitation.

Une fonction intégrée est identifiée soit en ne déclarant pas son nom et en lui laissant une valeur par défaut, soit en la déclarant explicitement BUILTIN. Une fonction du même nom fournie par l'utilisateur peut être substituée en la déclarant explicitement ENTRY.

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index