NSIMD
Une bibliothèque SIMD
pour le calcul Hautes Performances.

Présentation de NSIMD, une bibliothèque de vectorisation SIMD

Qu’est-ce que la programmation SIMD ?

SIMD signifie « une instruction, multiple données ». Il s'agit d'une classe d'ordinateurs capables d'effectuer simultanément les mêmes opérations sur plusieurs données. À titre d'exemple, un ordinateur à 1 GHz est capable de faire l'addition (ou la soustraction, la multiplication ...) de quatre paires de nombres en une nanoseconde alors qu'un ordinateur non SIMD aura besoin de 4 nanosecondes, une pour chacune des 4 additions des paires de nombres.

NSIMD : Une bibliothèque de vectorisation   pour la programmation SIMD.

NSIMD est une bibliothèque de vectorisation qui abstrait la programmation SIMD. Elle a été conçue pour exploiter le maximum de puissance des processeurs pour un faible coût de développement.

Afin d’atteindre les performances maximales, NSIMD s'appuie principalement sur la passe d'optimisation appelée « inline » du compilateur. Par conséquent, l'utilisation de n'importe quel compilateur grand public tel que GCC, Clang, MSVC, XL C / C ++, ICC et autres avec NSIMD vous procurera une bibliothèque d'abstraction SIMD sans overhead.

NSIMD pour tirer parti pleinement du SIMD

Maintenant que nous avons expliqué ce qu’est le SIMD, la librairie NSIMD et comment cela fonctionne, regardons maintenant comment tirer parti au maximum de cette dernière.

Les APIs C et C++ de NSIMD
pour l’optimisation

NSIMD fournit des APIs C89, C++98, C++11 et C++14. Toutes ces APIs permettent d'écrire du code générique. Pour l'API C, c’est possible grâce à une fine couche de macros ; pour les APIs C++, elle est atteinte en utilisant des templates la surcharge de fonctions. Les APIs C++ fournissent également des surcharges pour les opérateurs, une abstraction haut niveau des registres SIMD afin de permettre le déroulage de boucles. Les APIs C++11, C++14 ajoutent par exemple des typedef et des constantes templatées

La compatibilité binaire est garantie par le fait que seul une ABI C est exposée. L'API C++ ne fait que wrapper les appels C.

NSIMD et la programmation SIMD

La programmation SIMD se fait usuellement à l’aide de fonctions bas-niveaux appelés « intrinsics ». Ce sont des fonction offertes par les fabriquants pour accéder aux unités de calcul SIMD pour accélérer les calculs. Cependant, il est fastidieux d'en tirer parti et leur utilisation directe est sujette aux erreurs. C'est à ce moment qu'intervient NSIMD. En effet, NSIMD simplifie leur utilisation, en proposant une interface permettant d'écrire un code plus intelligible, plus facilement maintenable et qui garanti sa portabilité sur différentes architectures. 

Extensions SIMD prises en charge par NSIMD

La liste des extensions SIMD supportées est la suivante:
    - Intel:
  • + SSE 2
  • + SSE 4.2
  • + AVX
  • + AVX 2
  • + AVX-512 tel que trouvé sur les KNLs
  • + AVX-512 tel que trouvé sur les Xeon Skylake CPUs

    - Arm
  • + NEON 128 bits tel que trouvé sur les ARMv7 CPUs
  • + NEON 128 bits tel que trouvé sur les Aarch64 CPUs
  • + SVE
Les architectures suivantes seront bientôt disponibles:
    - NVIDIA
  • + CUDA
  • + HIP

    - AMD GPUs
  • + HIP

    - POWERPC
  • + VSX
  • + VMX

Partie open source de NSIMD et partie propriétaire

La plus grande partie de la bibliothèque est disponible en open source github et peut être téléchargée, testée et utilisée à volonté grâce à sa licence MIT.

Une petite partie propriétaire au prix de 49.90 €/utilisateur peut être achetée sur store.agenium-scale.com . Il contient entre autres :
- fonctions trigonométriques
- fonctions trigonométriques inverses
- fonctions hyperboliques
- fonctions hyperboliques inverses
- exponentielles - logarithmes

Achetez NSIMD pour une optimisation SIMD améliorée

NSIMD : GROMACS optimization for scientific computations

We have put NSIMD into GROMACS to demonstrate its potential. GROMACS is a versatile package to perform molecular dynamics, i.e. simulate the Newtonian equations of motion for systems with hundreds to millions of particles. It is heavely used in the HPC community to bench super computers and has became a reference in this area.

As GROMACS is already a fully optimized software our goal is to obtain similar running times and we do! It also prooves the claims of NSIMD, namely low development cost for high performences and portability. We have replaced nearly 11000 lines of GROMACS code by 4700 lines of NSIMD code.

NSIMD et GROMACS

Nous avons intégré NSIMD dans GROMACS pour démontrer son potentiel. GROMACS est un logiciel de simulation en dynamique moléculaire, autrement dit il permet de simuler les équations Newtonnienes de mouvement pour des systèmes consitutés de pllusieurs centaines à des millions de particules. Il est largement utilisé dans la communauté du HPC pour tester des superordinateurs et est devenu une référence dans ce domaine.

Comme GROMACS est déjà un logiciel très bien optimisé, notre objectif en insérer NSIMD dans son code était d'obtenir des performances similaires par rapport à sa version originale et c’est ce que nous obtenons ! Cela prouve également les revendications de NSIMD, à savoir un faible coût de développement pour des performances et une portabilité élevée. Nous avons remplacé près de 11 000 lignes de code GROMACS par 4700 lignes de code NSIMD.

NSIMD pour l’optimisation des réseaux de neurones profonds

Nous travaillons pour l'armée française et utilisons NSIMD comme bibliothèque de base pour notre moteur d'inférence de réseau neuronnaux profonds. Son API C++ nous permet d'écrire tous les noyaux des couches une seule fois et d'avoir de meilleures performances que Caffe sur les stations de travail Intel et les appareils mobiles Arm (tels que les smartphones). Nous accélérons les réseaux de neurones en utilisant la quantization et l'arithmétique à virgule fixe qui sont prises en charge par NSIMD.

Utilisez NSIMD dans des codes déjà existants

NSIMD addition loop
for (int i = 0; i < n; i +=len(pack< float >())) {
storea(&c[i], loada(&a[i]) + loada(&b[i]));
}
Traducteur de code non portable SIMD vers NSIMD

Nous avons rencontré plusieurs fois du code très bien optimisé écrit pour un processeur spécifique en utilisant l’API spécifique au fournisseur de matériel. Cette situation devient un problème lors de la mise à niveau du matériel et ce même auprès du même fournisseur. Beaucoup de gens achètent des Xeons plus récents qui fournissent la technologie AVX-512 mais ont écrit leur code pour des anciens Xeons fournissant AVX uniquement. C'est alors que notre traducteur entre en scène. Il s'agit d'un logiciel basé sur Clang qui prend du code C/C++ en entrée et remplace le code spécifique à un processeur. La sortie est du code C/C++ dont les appels aux APIs des fournisseurs auront été remplacés par du code NSIMD portable. Ce programme permet d'économiser environ 80% du temps de traduction. Le code résultant est alors portable et utilise les dernières capacités SIMD.

AARCH64 addition loop
for (int i = 0; i < n; i +=4) {
vst1q_f32(&c[i], vaddq_f32(
vld1q_f32(&a[i]), vld1q_f32(&b[i])));
}
SSE addition loop
for (int i = 0; i < n; i +=4) {
_mm_store_ps(&c[i], _mm_add_ps(
_mm_load_ps(&a[i]), _mm_load_ps(&b[i])));
}
AAVX addition loop
for (int i = 0; i < n; i +=8) {
_mm256_store_ps(&c[i], _mm256_add_ps(
_mm256_load_ps(&a[i]), _mm256_load_ps(&b[i])));
}
AVX-512 addition loop
for (int i = 0; i < n; i +=16) {
_mm512_store_ps(&c[i], _mm512_add_ps(
_mm512_load_ps(&a[i]), _mm512_load_ps(&b[i])));
}

NSIMD : Optimisez votre programmation SIMD maintenant !

Version Open Source

Gratuite

Une partie de la librairie est open source sur github ( lien no follow) et peut être téléchargée, testée et utilisées à volonté grâce à sa licence MIT.

Licence Propriétaire

49.90€ /mois

Une petite partie propriétaire au prix de 49,90€ /utilisateur peut être achetée.