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

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

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

アドバンスドベクトルエクステンション 2 (AVX2) はインテル x86 命令セットのベクトル化拡張で、256ビット以上のベクトルをシングルインストラクションマルチプルデータ (SIMD) で実行できるものです。 高度に並列化可能 な操作ができるベクトル化可能なアルゴリズムの場合、AVX2 を使用すると CPU パフォーマンスが向上され、その結果レイテンシーが低くなり、スループットが向上します。AVX2 命令セットは、機械学習推定、マルチメディア処理、科学シミュレーション、財務モデリングアプリケーションなどの計算負荷の高いワークロードに使用します。

注記

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++ ライブラリを使用して計算負荷の高いベクトル化可能な操作を実行する場合は、適切なコンパイラフラグを設定し、関数コードを再コンパイルできます。次に、コンパイラーはコードを自動的にベクトル化します。

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 命令を使用する演算機能が最適化されたライブラリです。などのフレームワークは PyTorch 、デフォルトでインテル MKL を使用して構築されるため、AVX2 を有効にする必要はありません。

などの一部のライブラリでは TensorFlow、ビルドプロセスでインテル MKL 最適化を指定するオプションが提供されます。例えば、 では TensorFlow、 --config=mklオプションを使用します。

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

Intel MKL および同様のライブラリの詳細については、Wikipedia の Math Kernel LibraryOpenBLAS ウェブサイト 、および の AMD BLIS リポジトリを参照してください GitHub。

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