11.3.4.2 : Utiliser des fonctions intrinsèques



Les fonctions intrinsèques représentent la limite entre le langage C et l'assembleur. Ce sont des fonctions C qui contiennent de l'assembleur. Cela permet de programmer quasiment en assembleur (mais en évitant certains inconvénients d'un vrai assembleur) dans un programme C ou C++. Ces fonctions sont très utiles pour effectuer manuellement des optimisations que le compilateur ne sait pas effectuer automatiquement.

Utilisation des fonctions intrinsèques bas niveau



Il est possible d'utiliser directement les fonctions bas niveaux fournies par Intel[52]Architecture software developer's manual volume 1, 2016.

Avantages : la programmation (experte) en fonctions intrinsèques permet d'obtenir de meilleures performances que celles atteintes par les compilateurs, car il est possible d'optimiser des algorithmes que le compilateur ne pourra pas optimiser noteCeci est dû à la mécanique interne des compilateurs. Ils utilisent une représentation interne qui décrit le programme comme un graphe et utilisent la théorie des graphes pour effectuer leurs optimisations. Or, ce graphe ne peut être modifié, car cela garantit le fait que le programme fonctionnera de la même manière que celle décrite par le développeur. Ce qui interdit certaines optimisations aux compilateurs..

Inconvénients : le code écrit directement en fonctions intrinsèques ne pourra être exécuté que sur les architectures qui utilisent le même jeu d'instruction (ou un jeu étendu). Il n'est donc pas complètement portable. Il est nécessaire d'être un expert du sujet pour écrire de telles fonctions.

Bien que l'écriture de fonctions optimisées à l'aide des fonctions intrinsèques soit difficile, il est possible pour un physicien averti de lire et de comprendre de telles fonctions.


Utilisation des fonctions intrinsèques dans une bibliothèque



Certaines bibliothèques, (xsimd[40]XSIMD : C++ wrappers for SIMD intrinsics, PLIBS 9[87]PLIBS 9, Pierre Aubert) fournissent une abstraction des fonctions intrinsèques. Cela permet de programmer avec des fonctions quasi-intrinsèques qui seront transformées en fonctions intrinsèques réelles lors de la compilation. Les programmes qui utilisent cette méthode voient leur portabilité améliorée, puisqu'une seule version du programme permet de calculer sur toutes les architectures supportées par la bibliothèque utilisée.

Avantages : cette méthode atteint les mêmes performances qu'une utilisation des vraies fonctions intrinsèques, tout en améliorant la portabilité du programme.

Inconvénients : il se peut que la durée de la compilation augmente suivant les bibliothèques utilisées. Il est toujours nécessaire d'être un expert du sujet pour utiliser ces bibliothèques. L'utilisation d'une bibliothèque tierce nécessitera un maintien de la compatibilité entre celle-ci et le programme désiré.

Comme précédemment, un physicien averti peut lire et comprendre de telles fonctions.