TensorFlow 中怎么使用intel的avx 指令集来优化 GEMM ?
TensorFlow 中怎么使用intel的avx 指令集来优化 GEMM ?

在 TensorFlow 中使用 Intel 的 AVX(Advanced Vector Extensions) 指令集来优化 GEMM(General Matrix Multiply,通用矩阵乘法) 主要依赖于底层的数学库优化。TensorFlow 本身并不直接编写 AVX 指令,而是通过集成高性能线性代数库(如 MKL、Eigen、OpenBLAS 等)来实现 GEMM 的加速。
🧠 背景知识
GEMM 是深度学习中最核心的运算之一,尤其是在卷积操作中,会被转换为 GEMM 来计算。因此,优化 GEMM 可以显著提升模型推理速度。
Intel 的 AVX 指令集(包括 AVX、AVX2、AVX-512)可以用于向量化加速 GEMM 运算。为了利用这些指令,TensorFlow 需要:
- 编译时启用对应的 CPU 指令集支持;
- 使用支持 AVX 优化的线性代数库(如 Intel MKL-DNN / MKL-ML);
✅ 方法一:使用 TensorFlow 官方预编译版本(推荐)
TensorFlow 的官方 pip 包(如 tensorflow
和 tensorflow-cpu
)从 v2.4 开始已经默认启用了 Intel MKL(Math Kernel Library)优化 ,并能自动利用 AVX/AVX2 指令进行 GEMM 加速。
如何确认是否启用了 AVX?
你可以运行以下代码来检查你的 TensorFlow 是否支持 AVX:
然后查看终端输出是否有类似下面的内容(如果看到 AVX/AVX2 字样说明已启用):
✅ 如果你看到的是这个信息,说明你的 TensorFlow 已经启用了基于 AVX 的 GEMM 优化。
✅ 方法二:从源码编译 TensorFlow 并启用 AVX(进阶)
如果你需要进一步控制编译选项(例如启用 AVX-512),你可以从源码构建 TensorFlow,并手动指定目标 CPU 架构。
步骤如下:
1. 安装 Bazel 和依赖项
2. 下载 TensorFlow 源码
3. 配置编译选项
在配置过程中选择启用 MKL、设置 Python 路径等。
4. 编译 TensorFlow 并启用 AVX/AVX2/AVX512
如果你想启用 AVX-512:
⚠️ 注意:确保你的 CPU 支持这些指令集,否则可能导致程序崩溃。
5. 打包并安装
✅ 方法三:使用 Intel 版本的 TensorFlow(推荐)
Intel 提供了专门优化过的 TensorFlow 发行版,称为:
Intel® Extension for TensorFlow*
它基于原生 TensorFlow,但对 CPU 上的性能进行了深度优化,包括:
- 利用 AVX/AVX2/AVX-512 指令集;
- 对 GEMM、卷积等操作进行算法优化;
- 更好的内存管理与多线程调度;
安装方法:
验证方式同上,查看日志是否包含 AVX 优化提示。
🧪 总结对比
方法
|
是否启用 AVX
|
是否推荐
|
备注
|
---|---|---|---|
官方
tensorflow-cpu |
✅ 启用 AVX/AVX2
|
✅ 推荐
|
自动优化,适合大多数用户
|
源码编译
|
✅ 可启用 AVX/AVX2/AVX512
|
❗进阶用户
|
需掌握编译技巧
|
Intel 定制版 TensorFlow
|
✅ 最佳优化效果
|
✅ 强烈推荐
|
专为 Intel CPU 优化
|
🔍 常见问题
Q: 我的 CPU 不支持 AVX,还能用 TensorFlow 吗?
A: 可以,只是性能可能不如启用了 AVX 的情况。TensorFlow 会回退到 SSE4.2 或其他兼容指令集。
Q: 为什么我看到警告“This TensorFlow binary is optimized with... but not running on a CPU that supports...”?
A: 因为你下载的版本是带 AVX 优化的,但你的 CPU 不支持 AVX 指令。建议更换不带 AVX 优化的版本或升级硬件。
📚 参考资料
如果你有具体的 CPU 型号或需求(比如只想启用 AVX2 或 AVX512),我可以帮你定制编译参数。欢迎继续提问!
请介绍一下这几个软件库MKL、Eigen、OpenBLAS

当然可以!下面是对 MKL、Eigen 和 OpenBLAS 这三个常见的数值计算库的详细介绍,它们在深度学习框架(如 TensorFlow、PyTorch)和科学计算中都扮演着重要角色。
📚 1. Intel® Math Kernel Library (MKL)
简介:
Intel MKL 是由 Intel 开发的一套高性能数学函数库,专为 Intel 架构优化。它提供了大量线性代数、快速傅里叶变换(FFT)、向量数学、统计等高性能实现。
核心功能:
- BLAS(Basic Linear Algebra Subprograms)
- LAPACK(线性方程组求解、矩阵分解等)
- FFT(快速傅里叶变换)
- 向量化数学函数(sin, cos, exp 等)
- 随机数生成器
特点:
优点
|
缺点
|
---|---|
✅ 极致性能,支持 AVX/AVX2/AVX512 指令集优化
|
❌ 主要针对 Intel CPU 做优化,AMD 上效果略差
|
✅ 多线程并行处理
|
❌ 闭源(商业用途需授权)
|
✅ 支持 Windows / Linux / macOS
|
❌ 安装和配置相对复杂
|
应用场景:
- TensorFlow、PyTorch(通过 oneDNN/MKL-DNN 调用)
- MATLAB、Mathematica 等商业软件
- 科学计算、金融建模、工程仿真
📚 2. Eigen
简介:
Eigen 是一个 C++ 模板库,专注于线性代数运算,包括矩阵和向量运算、几何变换、求解器等。它是开源且跨平台的,广泛用于机器学习、机器人、计算机视觉等领域。
核心功能:
- 矩阵和向量操作(加减乘除、转置、逆等)
- 稀疏矩阵支持
- 几何变换(旋转、平移等)
- 线性系统求解(Cholesky、QR、SVD 等)
特点:
优点
|
缺点
|
---|---|
✅ 纯头文件库,易于集成到项目中
|
❌ 性能不如 MKL 或 OpenBLAS 在大规模矩阵上的表现
|
✅ 支持向量化(SSE/AVX)自动优化
|
❌ 不支持多线程并行计算(除非手动结合 OpenMP)
|
✅ 开源、跨平台、无依赖
|
❌ 对稀疏矩阵的支持较弱(相比 SuiteSparse)
|
应用场景:
- C++ 项目中的线性代数计算
- 自研深度学习框架(如 tinygrad)
- 图形图像处理、SLAM(Simultaneous Localization and Mapping)
📚 3. OpenBLAS
简介:
OpenBLAS 是一个开源的高性能 BLAS 实现,基于 GotoBLAS2 发展而来。它支持多种架构(x86/x86_64/ARM/POWER),并且对多核 CPU 做了良好的并行优化。
核心功能:
- 所有标准 BLAS 接口(Level 1~3)
- 部分 LAPACK 功能(通过链接 LAPACK 参考实现)
- 多线程支持(默认开启)
特点:
优点
|
缺点
|
---|---|
✅ 开源免费,社区活跃
|
❌ 对于非 x86 平台优化程度不一
|
✅ 支持多线程加速
|
❌ 编译安装略复杂
|
✅ 支持 SSE/AVX 指令集优化
|
❌ 相比 MKL,性能略低但差距不大
|
✅ 跨平台(Linux / Windows / macOS / ARM)
|
❌ 不提供 LAPACK 的完整实现(需要额外链接)
|
应用场景:
- 替代 MKL 使用于 PyTorch、TensorFlow(部分版本)
- R、NumPy、SciPy 等 Python 科学计算库后端
- 高性能计算(HPC)、数据挖掘、生物信息学
🧪 性能对比(简化版)
库名
|
是否开源
|
多线程
|
向量化优化
|
最佳适用平台
|
性能排名(GEMM)
|
---|---|---|---|---|---|
MKL
|
❌
|
✅
|
✅(AVX/AVX2/AVX512)
|
Intel CPU
|
🔥 第一名
|
OpenBLAS
|
✅
|
✅
|
✅(SSE/AVX)
|
多平台
|
⚡ 第二名
|
Eigen
|
✅
|
❌(可手动启用)
|
✅(SSE/AVX)
|
C++ 项目
|
🐢 中小规模更快
|
🧩 如何选择?
场景
|
推荐库
|
---|---|
深度学习训练/推理(TensorFlow/PyTorch)
|
MKL / OpenBLAS
|
C++ 项目,追求易用性和代码清晰
|
Eigen
|
需要极致性能 + 使用 Intel CPU
|
MKL
|
开源项目、跨平台部署
|
OpenBLAS
|
小型嵌入式设备、ARM 平台
|
OpenBLAS / Eigen
|
🧠 补充说明:oneDNN vs MKL vs MKL-DNN
- MKL :底层数学库,提供 BLAS/LAPACK 等接口。
- MKL-DNN(已改名为 oneDNN) :面向深度学习的优化库,内部使用 MKL 来做 GEMM 加速。
- oneDNN :是 Intel 提供的用于加速深度神经网络计算的库,支持 CPU/GPU,被 TensorFlow、PyTorch 等使用。
如果你正在开发某个特定项目(比如 TensorFlow on CPU、自研推理引擎等),我可以根据你的需求推荐最合适的库组合。欢迎继续交流!
TensorFlow 怎么使能 Eigen 来做gemm?

在 TensorFlow 中,默认情况下并不会直接使用 Eigen 来做 GEMM(General Matrix Multiply)优化 。TensorFlow 的 GEMM 运算通常由底层的高性能数学库来完成,比如:
- Intel MKL(oneDNN)
- Eigen(部分情况)
- OpenBLAS(某些平台)
不过,在一些特定配置或环境下,TensorFlow 是可以通过 Eigen 实现 GEMM 加速的,尤其是在没有启用 MKL 的时候。
✅ 一、TensorFlow 如何与 Eigen 配合使用?
📌 TensorFlow 内部使用了 Eigen 库
TensorFlow 源码中其实已经内置了一个版本的 Eigen(位于 third_party/eigen3
),用于一些张量操作和自动向量化计算。但GEMM 核心运算一般不会通过 Eigen 直接实现 ,除非:
- 系统没有安装 MKL;
- 编译时禁用了 MKL 支持;
- 使用了较旧版本的 TensorFlow;
在这种情况下,TensorFlow 可能会回退到使用 Eigen 自带的矩阵乘法实现。
✅ 二、如何让 TensorFlow 使用 Eigen 做 GEMM?
方法:禁用 MKL 支持,使用默认路径
步骤如下:
1. 设置环境变量禁用 oneDNN(MKL-DNN)
这个设置可以关闭 Intel oneDNN 对 GEMM 和卷积等操作的加速,TensorFlow 会尝试使用内置路径(可能调用 Eigen)。
⚠️ 注意:这可能会显著降低性能,因为 Eigen 并非为大规模 GEMM 做极致优化。
2. 查看日志确认是否禁用了 MKL/oneDNN
运行以下代码:
如果你看到类似信息:
并且没有出现 oneDNN
或 MKL
字样,说明你已经绕过了 MKL 路径,可能使用了 Eigen 的实现。
✅ 三、从源码编译 TensorFlow 并强制使用 Eigen(进阶)
如果你想更明确地控制 TensorFlow 使用 Eigen 做 GEMM,可以从源码构建,并禁用 MKL 支持。
1. 下载并配置 TensorFlow 源码
在 ./configure
过程中:
- 不启用 MKL 支持(选择
No
) - 确保没有链接任何外部 BLAS/MKL 库
2. 构建时不包含 MKL
不加 --config=mkl
参数即可避免使用 MKL。
3. 安装自定义构建的 TensorFlow
此时 TensorFlow 将依赖 Eigen 提供的部分线性代数功能(尤其是小规模矩阵运算)。
✅ 四、Eigen 在 TensorFlow 中的实际用途
虽然 TensorFlow 不主要依赖 Eigen 来做 GEMM,但 Eigen 依然被广泛使用于:
- 张量广播(Broadcasting)
- 向量化操作(如
tf.sin
,tf.exp
) - 卷积的某些实现路径(尤其在移动设备上)
- 自动微分中的某些运算
✅ 五、Eigen vs MKL 性能对比(简化)
指标
|
MKL
|
OpenBLAS
|
Eigen
|
---|---|---|---|
GEMM 性能
|
🔥 最高(支持 AVX512)
|
⚡ 较高(支持 AVX)
|
🐢 低(适合小矩阵)
|
是否开源
|
❌ 商业授权
|
✅ 开源
|
✅ 开源
|
多线程支持
|
✅
|
✅
|
❌(需手动)
|
易集成
|
❌
|
✅
|
✅
|
✅ 六、总结
场景
|
是否建议使用 Eigen 做 GEMM?
|
---|---|
生产环境
|
❌ 不推荐,性能较低
|
学术研究、小型模型
|
✅ 可接受,便于调试
|
自研框架、嵌入式设备
|
✅ 推荐,轻量易移植
|
想测试不同后端性能
|
✅ 可以配合禁用 MKL 测试
|
📚 参考资料
如果你正在尝试对比不同库对 GEMM 的影响(例如 Eigen vs MKL),我可以帮你写一个基准测试脚本。欢迎继续提问!