Lambda で AVX2 ベクトル化を使用する
アドバンスドベクトルエクステンション 2 (AVX2) はインテル x86 命令セットのベクトル化拡張で、256ビット以上のベクトルをシングルインストラクションマルチプルデータ (SIMD) で実行できるものです。 高度に並列化可能
Lambda arm64 は NEON SIMD アーキテクチャを使用します。また、x86 AVX2 拡張機能をサポートしません。
Lambda 関数で AVX2 を使用するには、関数コードが AVX2 最適化コードにアクセスしていることを確認してください。言語によっては、AVX2 がサポートするバージョンのライブラリとパッケージをインストールできます。他の言語では、適切なコンパイラーフラグセット (コンパイラーが自動ベクトル化をサポートしている場合) を使用して、コードと依存関係を再コンパイルできます。また、AVX2 を使用して演算機能を最適化するサードパーティライブラリを使用してコードをコンパイルすることもできます。たとえば、インテルマスカーネルライブラリー(インテル MKL)、OpenBLAS(基本線形代数サブプログラム)、AMD BLASライクライブラリインスタンシエーションソフトウェア (BLIS)などです。Java などの自動ベクトル化された言語では、計算に AVX2 が自動的に使用されます。
追加コストなしで、新しい Lambda ワークロードを作成したり、既存の AVX2 対応のワークロードを Lambda に移動させたりすることができます。
AVX2 の詳細については、Wikipedia の「 Advanced Vector Extensions 2
ソースからのコンパイル
Lambda 関数が C または C++ ライブラリを使用して計算負荷の高いベクトル化可能な操作を実行する場合は、適切なコンパイラフラグを設定し、関数コードを再コンパイルできます。次に、コンパイラーはコードを自動的にベクトル化します。
gcc
、 clang
コンパイラでは、-march=haswell
をコマンドに追加するか、-mavx2
をコマンドオプションとして設定します。
~ gcc -march=haswell main.c or ~ gcc -mavx2 main.c ~ clang -march=haswell main.c or ~ clang -mavx2 main.c
特定のライブラリを使用するには、ライブラリのドキュメントの指示に従ってライブラリをコンパイルおよび構築します。たとえば、ソースから TensorFlow を構築するには、TensorFlow ウェブサイトの インストール手順 -march=haswell
を使用してください。
インテル MKL での AVX2 の有効化
インテル MKL は、コンピューティングプラットフォームが AVX2 命令をサポートしている場合、暗に AVX2 命令を使用する演算機能が最適化されたライブラリです。インテル MKL で PyTorch などのフレームワークが デフォルトで構築
TensorFlow などの一部のライブラリでは、構築プロセスにインテル MKL 最適化を指定するなどのオプションがあります。たとえば、TensorFlow では、--config=mkl
オプションを使用します。
インテル MKL を使用して、SciPy や NumPy など、人気の科学的 Python ライブラリを構築することもできます。インテル MKL でこれらのライブラリを構築する方法については、インテル ウェブサイトの Numpy/Scipy インテル MKL およびインテル コンパイラー
インテル MKL および類似のライブラリの詳細については、Wikipedia の Math Kernel ライブラリ
他の言語での AVX2 のサポート
C または C++ ライブラリを使用せず、インテル MKL で構築しない場合も、アプリケーションの AVX2 のパフォーマンス向上ができます。実際の改善はコンパイラーまたはインタープリタのコードで AVX2 機能を活用する能力次第です。
- Python
-
大量のコンピューティング負荷を処理する場合、一般的に Python ユーザーは SciPy および NumPy ライブラリを使用します。これらのライブラリをコンパイルして AVX2 を有効にすることも、インテル MKL 対応バージョンのライブラリを使用することもできます。
- ノード
-
処理負荷の高いワークロードの場合は、AVX2 対応、またはインテル MKL 対応バージョンのライブラリを使用してください。
- Java
-
Java の JIT コンパイラーは、AVX2 命令で実行するようにコードを自動ベクトル化できます。ベクトル化されたコードの検出については、OpenJDK ウェブサイト、 JVM プレゼンテーションの「 コードのベクトル化
」を参照してください。 - Go
-
標準の Go コンパイラーは現在、自動ベクトル化をサポートしていませんが、Go の GCC コンパイラー gccgo
を使用できます。 -mavx2
オプションを設定します。gcc -o avx2 -mavx2 -Wall main.c
- 組込み関数
-
多くの言語では 組み込み関数
を使用して、コードを手動でベクトル化して AVX2 を使用することが可能です。ただし、このアプローチはお勧めしません。ベクトル化されたコードを手動で記述すると、多大な労力がかかります。また、このようなコードのデバッグと管理は、自動ベクトル化に依存するコードを使用するよりも困難です。