在 Lambda 中使用 AVX2 向量化 - AWS Lambda

在 Lambda 中使用 AVX2 向量化

進階向量延伸項目 2 (AVX2) 是 Intel x86 指令集的向量化延伸項目,可透過 256 位元的向量來執行單一指令多重資料 (SIMD) 指令。針對具有高度可平行化操作的向量演算法,使用 AVX2 可以增強 CPU 效能,從而降低延遲並提高輸送量。將 AVX2 指令集用於運算密集型工作負載,例如機器學習推論、多媒體處理、科學模擬和財務模型應用程式。

注意

Lambda arm64 使用 NEON SIMD 架構,且不支援 x86 AVX2 延伸模組。

若要將 AVX2 與您的 Lambda 函數搭配使用,請確保您的函數程式碼將存取 AVX2 最佳化程式碼。針對某些語言,您可以安裝 AVX2 支援的程式庫和套件版本。針對其他語言,您可以使用適當的編譯器標記集 (如果編譯器支援自動向量化),來重新編譯程式碼和相依項。您還可以使用 AVX2 來最佳化數學運算的第三方程式庫,來編譯程式碼。例如,Intel Math Kernel Library (Intel MKL)、OpenBLAS (Basic Linear Algebra Subprograms) 和 AMD BLAS-like Library Instantiation Software (BLIS)。自動向量化的語言 (如 Java) 會自動使用 AVX2 進行運算。

您可以建立新的 Lambda 工作負載,或免費將啟用 AVX2 的現有工作負載移至 Lambda。

如需有關 AVX2 的詳細資訊,請參閱 Wikipedia 中的進階向量延伸項目 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 編譯選項。

針對 Intel MKL 啟用 AVX2

Intel MKL 是最佳化數學運算的程式庫,其在運算平台提供支援時隱式使用 AVX2 指令。預設會使用 Intel MKL 建置 PyTorch 等框架,因此您不需要啟用 AVX2。

某些庫,例如 TensorFlow,在其建置程序中提供指定 Intel MKL 最佳化的選項。例如,透過 TensorFlow 可使用 --config=mkl 選項。

您還可以使用 Intel MKL 建置常用的科學 Python 程式庫,如 SciPy 和 NumPy。如需有關使用 Intel MKL 建置這些程式庫的說明,請參閱 Intel 網站上 Intel MKL 和 Intel 編譯器的 Numpy/Scipy

如需有關 Intel MKL 和類似程式庫的詳細資訊,請參閱 Wikipedia 中的數學內核程式庫OpenBLAS 網站,以及 GitHub 上的 AMD BLIS 儲存庫

AVX2 的其他語言支援

如果您不使用 C 或 C ++ 程式庫,而且不使用 Intel MKL 進行建置,您仍然可以針對您的應用程式取得一些 AVX2 效能改善。請注意,實際改善取決於編譯器或解譯器在您的程式碼上利用 AVX2 功能的能力。

Python

Python 使用者通常使用 SciPy 和 NumPy 程式庫,來處理運算密集型工作負載。您可以編譯這些程式庫以啟用 AVX2,或者使用支援 Intel MKL 的程式庫版本。

節點

針對運算密集型工作負載,請使用您需要的支援 AVX2 或 Intel MKL 的程式庫版本。

Java

Java 的 JIT 編譯器可以自動向量化您的程式碼,以使用 AVX2 指令來執行。如需有關偵測向量化程式碼的資訊,請參閱 OpenJDK 網站上的 JVM 中的程式碼向量化簡報。

前往

標準 Go 編譯器目前不支援自動向量化,但您可以使用 Go 的 GCC 編譯器 gccgo。設定 -mavx2 選項:

gcc -o avx2 -mavx2 -Wall main.c
內部函數

可以使用多種語言的內部函數,手動向量化您的程式碼以使用 AVX2。不過,我們不建議使用這種方法。手動編寫向量化程式碼需要大量工作。此外,偵錯和維護此類程式碼比使用依賴於自動向量化的程式碼更為困難。