了解 AVX-512 并验证其在 AMD EPYC(霄龙)上的使用情况
Feb 10, 2026
在高性能计算和人工智能领域,对更高吞吐量的追求往往指向一个核心问题:如何在每个时钟周期内完成更多工作? Advanced Vector Extensions 512 (AVX-512) 的引入,正是为了解答这个问题而诞生的强大工具;它能在不改变时钟速度的前提下提升吞吐量。该技术现已应用于基于第五代 AMD EPYC(霄龙)“Turin”处理器的最新 Amazon EC2 实例。
什么是 AVX-512?
单指令多数据 (Single Instruction, Multiple Data, SIMD) 处理架构是现代处理器的核心,旨在应对计算密集型工作负载。这种架构允许单个 CPU 指令同时处理多个数据元素。AVX(Advanced Vector Extensions,高级矢量扩展)指令集系列的引入,正是为了扩大 SIMD 处理的数据宽度并提升吞吐量,以高效应对计算密集型工作负载。
AVX 技术逐步发展演进,通过不断扩大所处理数据的宽度,在相同时钟周期内实现了越来越高的吞吐量。早期的迭代版本(如 SSE)使用 128 位矢量,AVX2 扩展到 256 位,而 AVX-512 则再次将容量翻倍至 512 位。这意味着单个 AVX-512 指令可在一个周期内处理 16 个单精度(32 位)浮点数,或 64 字节的数据。对于计算密集型应用而言,这表示吞吐量大幅提升,且无需按比例增加时钟频率或功耗。
AVX 指令广泛应用于需要密集数值计算的场景,如线性代数、信号处理、科学模拟、数据分析和机器学习预处理。金融服务和生命科学领域的客户正利用 AVX-512 加速蒙特卡洛模拟和基因组测序,从而显著降低延迟并加快科研成果产出速度。同样,媒体和网络安全行业也在利用这些 512 位寄存器,以缩短 8K 视频转码时间,并提升 AES-XTS 等复杂加密算法的性能。
早期的 AVX2 CPU 需通过组合两次 256 位矢量运算来执行 512 位数学运算,而这会增加指令压力并降低整体效率。在采用第五代 AMD EPYC(霄龙)“Turin”处理器的最新云实例(M8a、C8a、R8a、C4D、H4D、E6、Dasv7、Fasv7、Easv7)上,这种运算能力可通过完整的 512 位数据路径来实现。
然而,即便服务器支持 AVX-512,也并不意味着应用正在使用该指令集。许多旧版二进制文件或未经优化的库默认使用 AVX2 甚至 SSE 指令,导致大量计算性能未得到释放而“白白浪费”。在实际场景中,许多应用会回退到更窄的矢量路径,在运行时混合使用不同宽度的指令,甚至完全无法触发矢量化代码路径。
要充分发挥 AVX-512 的强大能力,不仅需要了解应用能否使用该指令集,更要确认它在实际执行环境下是否真的使用了该指令集。
为了解决这个问题,性能工程师需要一种可靠的方法来验证指令级活动。在本文中,我们将以 Dgemm 作为示例应用,该应用会通过矩阵乘法执行复杂的矢量运算。同时,我们将使用 Proceswatch、perf 和 uProf 等性能分析工具,验证您的应用是否真正利用了 AVX-512 并充分释放了 AMD Turin 硬件的性能潜力。
验证 CPU AVX-512 能力
在深入探索性能分析工具之前,第一步是验证您的环境是否已配置为支持 AVX-512。
验证是否支持的直接方法是查询 CPU 标志。
grep -o 'avx512f' /proc/cpuinfo | head -n 1
AMD Turin 还支持高级子集,如 AVX512_BF16 和 AVX512_FP16。您可以运行更广泛的检查来查看所支持的全套 512 位扩展。
grep -E 'avx512' /proc/cpuinfo | head -n 1 | tr ' ' '\n' | grep 'avx512'
如果缺少 avx512f 标志,您的应用很可能会回退到 AVX2(256 位)或 SSE(128 位)代码路径。
现在,我们来验证您的应用是否在利用 AVX512。请注意,您无需使用所有这些工具。每种工具提供不同的观测维度,涵盖高层级汇总统计和低层级硬件计数器分析。您可以选择最符合自身技术需求或现有环境的工具。
我使用 DGEMM 作为示例应用,并已在另一个终端中将其启动。
./dgemm_avx512 16384 600
您可以在此处找到我所用的脚本和相关使用说明:https://github.com/nfairoza/cloud-samples/tree/main/avx512-check
Perf 工具
Perf 是一个标准的 Linux 性能分析工具,能够访问 CPU 公开的硬件性能计数器,并展示工作负载已退役的指令数量、消耗的周期数,以及运行的浮点指令和矢量指令类型。
CPU 内有针对不同矢量宽度的专用计数器。通过监控这些计数器,我们可以精确地了解在 128 位、256 位和 512 位通道中“退役”的指令数量。
perf list --details:此命令会显示事件的符号化名称
# 检查是否发生 512 位操作
perf stat -e fp_ops_retired_by_width.pack_512_uops_retired \
-p $(pgrep -f dgemm_avx512_new) -- sleep 10
# 查看使用的矢量宽度
perf stat \
-e fp_ops_retired_by_width.pack_128_uops_retired \
-e fp_ops_retired_by_width.pack_256_uops_retired \
-e fp_ops_retired_by_width.pack_512_uops_retired \
-e fp_ops_retired_by_width.scalar_uops_retired \
-p $(pgrep -f dgemm_avx512_new) -- sleep 10
如您所见,约 99.9% 的浮点运算工作都发生在 512 位宽的操作中,这正是经过充分优化的 avx512 所应达到的结果。
在内部,perf 使用由事件代码和单元掩码 (umask) 组成的原始事件编码来对性能监控计数器进行编程。在 AMD EPYC(霄龙)Turin 上,映射关系如下:
/avx512-event-chart-light-1200x675.png)
您既可以使用符号化事件名称,也可以使用原始编码。当符号化名称不可用或在不同内核中不一致时,原始编码会变得尤其有用。
perf stat \
-e r0408 \
-e r0808 \
-e r1008 \
-e r2008 \
-p $(pgrep -f dgemm_avx512_new) -- sleep 10
如果超过 99% 的浮点运算发生在 512 位操作类别中,则证实工作负载正在充分利用 AVX-512 执行单元。
ProcessWatch 工具
ProcessWatch 是一个轻量级 Linux 实用工具,专门用于实时识别运行中进程的指令组合。ProcessWatch 不会暴露原始硬件事件,而是以简单、易读的方式展示指令组合情况,即在每个采样周期内有多少执行的指令来自 SSE、AVX、AVX2 和 AVX-512。
要使用 ProcessWatch,需先启动应用或基准测试。进程运行后,将 ProcessWatch 附加到该进程,并筛选您所关注的指令集。在此示例中,我们将其附加到 DGEMM 工作负载,以监控不同矢量宽度之间的转换情况。
sudo ./processwatch -p $(pgrep -n dgemm_avx512) \
-f SSE -f AVX -f AVX2 -f AVX512 -f AMX_TILE 2>/dev/null
在上述结果中,AVX512 列所显示的值始终为 0.13 或 0.14。这个数值乍看之下似乎偏低,但实际上却是高效执行的标志。数值 0.14 代表在该采样周期内,CPU 退役的全部指令中有 14% 为 AVX-512 指令。一条 AVX-512 指令可以同时处理 8 个双精度数值。若使用标准指令完成相同的运算量,CPU 需要执行更多的独立操作。因此,即使数学运算 100% 都由 AVX-512 指令完成,它也仅占总指令数的一小部分。您可能会注意到,SSE、AVX 和 AVX2 的数值都为零,这表明应用完全避开了较旧的矢量路径,并通过 512 位通道来执行操作。
uProf 工具
uProf 是一个高性能分析套件,不仅提供命令行接口 (AMDuProfCLI),还配备功能完善的图形用户界面。借助该工具,您可以生成可视化报告、图表,甚至执行源代码级归因分析,精确定位触发 AVX-512 指令的代码行。
您可以直接从 AMD 网站下载 uProf。在下载过程中,AMD 会要求您查看并接受最终用户许可协议 (EULA)。一旦您接受相关条款,即可获得以压缩包格式提供的 uProf 软件包,随后将其传输到需要进行分析的系统中。默认情况下,uProf 不会安装到系统路径中,因为它以独立目录的形式提供,而目录内包含 CLI 和 GUI 工具。因此,该工具通常要从 bin/ 目录中通过相对路径(如 ./AMDuProfCLI)来进行调用;或者,为方便起见,可将 uProf bin/ 目录添加到 $PATH 中。
export PATH=$PATH:/path/to/AMDuProf_Linux_x64/bin
# 或者
sudo ln -sf $HOME/noorwork/AMDuProf_Nda_Linux_x64_5.0.1498/bin/AMDuProfCLI /usr/local/bin/AMDuProfCLI
AMDuProfCLI --version
在 AMD Turin (Zen 5) 上,我们使用硬件事件代码 0x08 (PMCx008)。为了区分不同的矢量宽度,我们在采集命令中直接应用特定的单元掩码。以下命令将附加到正在运行的 DGEMM 进程,并采集 30 秒的数据。
sudo AMDuProfCLI collect \
-p $(pgrep -f dgemm_avx512_new) \
-d 30 \
--output-dir uprof_avx512_validation \
-e event=PMCx008,umask=0x01,interval=250000 \ # 标量
-e event=PMCx008,umask=0x02,interval=250000 \ # 128 位
-e event=PMCx008,umask=0x04,interval=250000 \ # 256 位
-e event=PMCx008,umask=0x08,interval=250000 # 512 位
uProf 分析工具应用基于采样的数据采集方式,采样间隔为 250,000,这意味着每当硬件计数器达到 250,000 次操作时,uProf 就会记录一个样本。这与单独统计每一次操作的工具(如 perf)存在本质区别。
如果您的应用执行了 10 万亿次 AVX-512 操作,perf 会显示这个庞大的总数。相比之下,uProf 可能仅显示 11,616 个样本。这种统计方法能够精准呈现 CPU 时间花费在何处,同时避免计算每个周期带来的巨大开销。
数据采集完成后,您可以生成 CSV 或 HTML 报告来查看统计分布。
AMDuProfCLI report -i uprof_avx512_validation/AMDuProf-Data/
cat uprof_avx512_validation/AMDuProf-Data/report.csv
通过在 report.csv 中查看热点进程的数据,我们可以看到,该应用的标量运算样本数累计为 0,128 位运算样本数为 120,256 位运算样本数为 15,而 512 位运算样本数为 11,616。
我们看到 512 位样本占据主导地位,占所有浮点运算工作负载的 98.85%。这可以证明我的示例应用在有效利用 AVX512。
结语
针对最新的云硬件进行优化,不只是选择正确的实例类型那么简单。更为关键的是,要验证您的软件是否充分发挥了硬件的强大实力。在本文中,我们使用 DGEMM 工作负载进行了演示,结果表明第五代 AMD EPYC(霄龙)“Turin”处理器中的原生 512 位数据路径能够显著提升吞吐量,但这种潜力仅在应用持续使用 512 位指令时才能真正发挥出来。
如果您要运行计算密集型工作负载,并希望充分发挥 AVX-512 的优势,请不要止步于验证。请根据实际测量结果,做出更明智的平台和优化决策。
无需孤军奋战
如果您要运行计算密集型工作负载,并希望充分发挥 AVX-512 的优势,请不要止步于验证。请根据实际测量结果,做出更明智的平台和优化决策。
切换 CPU 架构并不需要完全重写代码或经历漫长的迁移周期。在许多情况下,您只需更改实例类型,使用您现有的工具和工作流程重新部署,即可测试支持 AVX-512 的实例。如需了解更多信息,请参阅 AMD 迁移指南。
无论您是要对现有工作负载进行现代化升级、精简超大规模环境,还是单纯寻求更高性能和成本效益,AMD 都能提供实用工具和专业知识,帮助您做出明智决策。如果您需要专业人士帮您解读测试结果、调优应用或判断支持 AVX-512 的实例是否适合您现有的环境,欢迎联系 AMD 团队。AMD 直接与金融、AI、分析和科学计算等领域的客户开展合作,帮助客户开展矢量化验证、分析指令行为以及将工作负载匹配到合适的 EPYC(霄龙)平台。