在 Lambda 中使用 AVX2 向量化 - Amazon Lambda
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

在 Lambda 中使用 AVX2 向量化

Advanced Vector Extensions 2 (AVX2) 是 Intel x86 指令集的向量化扩展,可以对 256 位向量执行单指令多数据 (SIMD) 指令。对于采用 高度可并行化运算的向量化算法,使用 AVX2 可以提高 CPU 性能,从而降低延迟并提高吞吐量。将 AVX2 指令集用于机器学习推理、多媒体处理、科学模拟和财务建模应用程序等计算密集型工作负载。

要将 AVX2 与 Lambda 函数结合使用,请确保函数代码可以访问针对 AVX2 优化的代码。对于某些语言,您可以安装支持 AVX2 的库和程序包版本。对于其他语言,您可以使用相应的编译器标记集(如果编译器支持自动向量化)来重新编译代码和依赖项。您还可以通过利用 AVX2 来优化数学运算的第三方库来编译代码。例如,Intel 数学内核库 (Intel MKL)、OpenBLAS(基本线性代数子程序)和类似 AMD BLAS 的库实例化软件 (BLIS)。自动向量化语言(如 Java)会自动使用 AVX2 进行计算。

您可以创建新的 Lambda 工作负载或免费将启用 AVX2 的现有工作负载移至 Lambda。

有关 AVX2 的更多信息,请参阅维基百科中的 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 编译选项。

为 Intel MKL 启用 AVX2

Intel MKL 是一个优化的数学运算库,在计算平台支持 AVX2 指令时,它会隐式使用这些指令。由于 PyTorch 等框架默认使用 Intel MKL 进行构建,因此您无需再启用 AVX2。

TensorFlow 等库在构建过程中会提供选项来指定 Intel MKL 优化。例如,TensorFlow 使用 --config=mkl 选项。

您还可以使用 Intel MKL 构建热门的科学 Python 库,例如 SCIPY 和 NumPy。有关使用 Intel MKL 构建这些库的说明,请参阅 Intel 网站上的 使用 Intel MKL 和 Intel 编译器的 Nummpy/Scipy

有关 Intel MKL 和类似库的更多信息,请参阅维基百科中的 数学内核库 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 编译器目前不支持自动向量化,但是您可以使用 gccgo,它是适用于 Go 的 GCC 编译器。设置 -mavx2 选项:

gcc -o avx2 -mavx2 -Wall main.c
内部函数

可以在许多语言中使用 内部函数来手动向量化代码,以使用 AVX2。但是,我们不推荐这种方法。手动编写向量化代码需要耗费大量精力。而且,调试和维护此类代码比使用依赖于自动向量化的代码更加困难。