Utilisation de la vectorisation AVX2 dans Lambda - AWS Lambda

Utilisation de la vectorisation AVX2 dans Lambda

Advanced Vector Extensions 2 (AVX2) est une extension de vectorisation du jeu d'instructions Intel x86 qui peut exécuter des instructions SIMD sur des vecteurs de 256 bits. Pour les algorithmes vectorisables avec un fonctionnement hautement parallélisable, l'utilisation d'AVX2 peut améliorer les performances du processeur et ainsi entraîner des latences plus faibles et un débit plus élevé. Utilisez le jeu d'instructions AVX2 pour les charges de travail avec calcul intensif telles que l'inférence de machine learning, le traitement multimédia, les simulations scientifiques et les applications de modélisation financière.

Note

Lambda arm64 utilise l'architecture NEON SIMD et ne prend pas en charge les extensions x86 AVX2.

Pour utiliser AVX2 avec votre fonction Lambda, assurez-vous que votre code de fonction accède au code optimisé AVX2. Pour certains langages, vous pouvez installer la version des bibliothèques et des packages supportée par AVX2. Pour les autres, vous pouvez recompiler votre code et vos dépendances avec les options du compilateur appropriées (si le compilateur prend en charge la vectorisation automatique). Vous pouvez également compiler votre code avec des bibliothèques tierces qui utilisent AVX2 pour optimiser les opérations mathématiques. Par exemple, Intel Math Kernel Library (Intel MKL), OpenBlas (Basic Linear Algebra Subprograms) et BLIS (AMD BLAS-like Library Instantiation Software). Les langages vectorisés automatiquement tels que Java utilisent automatiquement AVX2 pour les calculs.

Vous pouvez créer de nouvelles charges de travail Lambda ou déplacer des charges de travail existantes compatibles AVX2 vers Lambda sans frais supplémentaires.

Pour plus d'informations sur AVX2, consultez l’article Advanced Vector Extensions 2 dans Wikipédia.

Compilation à partir d’un fichier source

Si votre fonction Lambda utilise une bibliothèque C ou C++ pour effectuer des opérations vectorisables de calculs intensifs, vous pouvez définir les options du compilateur appropriées et recompiler le code de la fonction. Le compilateur vectorise alors automatiquement votre code.

Pour le compilateur gcc ou clang, ajoutez -march=haswell à la commande ou définissez -mavx2 en tant qu'option de commande.

~ gcc -march=haswell main.c or ~ gcc -mavx2 main.c ~ clang -march=haswell main.c or ~ clang -mavx2 main.c

Pour utiliser une bibliothèque spécifique, suivez les instructions des lignes directrices de la bibliothèque pour la compiler et la construire. Par exemple, pour créer TensorFlow à partir de la source, vous pouvez suivre les instructions d'installation du site Web TensorFlow. Assurez-vous d'utiliser l'option de compilation -march=haswell.

Activation d'AVX2 pour Intel MKL

Intel MKL est une bibliothèque d'opérations mathématiques optimisées qui utilisent implicitement les instructions AVX2 lorsque la plateforme de calcul les prend en charge. Les frameworks tels que PyTorch intègrent Intel MKL par défaut, vous n'avez donc pas besoin d'activer AVX2.

Certaines bibliothèques, telles que TensorFlow, fournissent des options dans leur processus de compilation pour spécifier l'optimisation Intel MKL. Par exemple, avec TensorFlow, utilisez l'option --config=mkl.

Vous pouvez également créer des bibliothèques scientifiques en Python, telles que SciPy et NumPy, avec Intel MKL. Pour obtenir des instructions sur la création de ces bibliothèques avec Intel MKL, consultez Numpy/Scipy avec Intel MKL et les compilateurs Intel sur le site Web d'Intel.

Pour plus d'informations sur Intel MKL et les bibliothèques similaires, consultez la Math Kernel Library dans Wikipedia, le site Web OpenBLASet les fonds AMD BLIS sur GitHub.

Prise en charge d'AVX2 dans d'autres langues

Si vous n'utilisez pas les bibliothèques C ou C++ et que vous ne construisez pas avec Intel MKL, vous pouvez toujours optimiser les performances de vos applications avec AVX2. Notez que l'amélioration dépend en réalité de la capacité du compilateur ou de l'interpréteur à utiliser les fonctionnalités AVX2 sur votre code.

Python

Les utilisateurs de Python ont généralement recours aux bibliothèques SciPy et NumPy pour les charges de travail avec calcul intensif. Vous pouvez compiler ces bibliothèques pour activer AVX2 ou utiliser les versions des bibliothèques compatibles avec Intel MKL.

Nœud

Pour les charges de travail exigeantes en calcul, utilisez les versions compatibles AVX2 ou Intel MKL des bibliothèques dont vous avez besoin.

Java

Le compilateur JIT de Java peut auto-vectoriser votre code pour s'exécuter avec des instructions AVX2. Pour plus d'informations sur la détection du code vectorisé, consultez la présentation Vectorisation de code dans la machine virtuelle Java sur le site Web OpenJDK.

Go

Le compilateur Go standard ne prend actuellement pas en charge la vectorisation automatique, mais vous pouvez utiliser gccgo, le compilateur basé sur GCC pour Go. Définissez l'option -mavx2:

gcc -o avx2 -mavx2 -Wall main.c
Fonctions intrinsèques

Il est possible d'utiliser des fonctions intrinsèques dans de nombreux langages pour vectoriser manuellement votre code pour utiliser AVX2. Cependant, nous ne recommandons pas cette approche. L'écriture manuelle de code vectorisé nécessite des efforts considérables. En outre, le débogage et la maintenance d'un tel code est plus difficile que d'utiliser du code qui dépend de la vectorisation automatique.