Lambda で AVX2 ベクトル化を使用する - AWS Lambda

Lambda で AVX2 ベクトル化を使用する

アドバンスドベクトルエクステンション 2 (AVX2) はインテル x86 命令セットのベクトル化拡張で、256ビット以上のベクトルをシングルインストラクションマルチプルデータ (SIMD) で実行できるものです。 高度に並列化可能 な操作ができるベクトル化可能なアルゴリズムの場合、AVX2 を使用すると CPU パフォーマンスが向上され、その結果レイテンシーが低くなり、スループットが向上します。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++ ライブラリを使用して計算負荷の高いベクトル化可能な操作を実行する場合は、適切なコンパイラフラグを設定し、関数コードを再コンパイルできます。次に、コンパイラーはコードを自動的にベクトル化します。

gccclang コンパイラでは、-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 などのフレームワークが デフォルトで構築 されるため、AVX2 を有効にする必要はありません。

TensorFlow などの一部のライブラリでは、構築プロセスにインテル MKL 最適化を指定するなどのオプションがあります。たとえば、TensorFlow では、--config=mkl オプションを使用します。

インテル MKL を使用して、SciPy や NumPy など、人気の科学的 Python ライブラリを構築することもできます。インテル MKL でこれらのライブラリを構築する方法については、インテル ウェブサイトの Numpy/Scipy インテル MKL およびインテル コンパイラー を参照してください。

インテル MKL および類似のライブラリの詳細については、Wikipedia の Math Kernel ライブラリ OpenBLAS ウェブサイト 、GitHub の AMD BLIS リポジトリ を参照してください。

他の言語での 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 を使用することが可能です。ただし、このアプローチはお勧めしません。ベクトル化されたコードを手動で記述すると、多大な労力がかかります。また、このようなコードのデバッグと管理は、自動ベクトル化に依存するコードを使用するよりも困難です。