想象你是一位少年宫的合唱团指挥。要让32个孩子学会同一首歌,你有两种教法:一是把他们一个个叫到跟前单独教唱——教完一个再教下一个,效率低得让人崩溃;二是让他们在舞台上站成一个方阵,你站在指挥台上举起双手,一个手势下去,所有人的声音同时迸发——一次教一群,这才是指挥该有的样子。计算机里的SIMD(Single Instruction Multiple Data,单指令多数据)技术,就是为CPU设计的“合唱指挥法”:用一条指令,同时驱动多个数据通道完成相同的运算。而AVX-512则是Intel为这场“合唱”搭建的顶级舞台——512位宽的向量寄存器,相当于一条能容纳16个32位“小歌手”同时站立的超宽站台。可全员同时开口难免混乱,指挥需要一本“点名册”精确控制谁唱谁停,这就是掩码寄存器k0-k7的由来。舞台太大也可以灵活伸缩?VL、BW、DQ三个子集分别对应不同“体型”的数据编队。这篇文章,就用这支合唱团,带你从零看懂SIMD/AVX-512的硬件搭建逻辑。

岗位关联

对AI从业者而言,向量化是推理引擎、数据处理管线性能优化的核心手段。看懂SIMD/AVX-512的寄存器、掩码与子集,才能写出真正高效的向量化代码,也能在性能调优时直击瓶颈,而不是靠玄学调参。

目录
  1. 可视化演示
  2. SIMD基本思想:一个手势,全员开口
  3. 512位向量寄存器:合唱团的超大舞台
  4. 掩码寄存器k0-k7:指挥手里的点名册
  5. VL子集:可伸缩的舞台
  6. BW子集:童声部的大合唱
  7. DQ子集:成人部的宽声线
  8. 向量化编程基础:把独唱谱改成合唱谱
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

通过512位寄存器布局、掩码寄存器控制和VL/BW/DQ子集对比三个模式,深入理解AVX-512向量计算的硬件基础。

本节配有交互动效(进入视口后自动加载,约 3KB)。

512位向量寄存器数据布局 ZMM寄存器512位,可容纳16×float32或8×double64或64×int8 单条指令同时处理所有数据通道,实现数据级并行 Throughput = Width / Element_Size (e.g. 512/32 = 16 floats/cycle) SIMD通过宽寄存器实现单指令多数据,是AI推理加速的硬件基础

SIMD基本思想:一个手势,全员开口

排练厅里,老指挥习惯把孩子们一个个叫上来独唱,纠正完音准再换下一个。新来的指挥却让孩子们排成方阵,自己只负责挥动双手——所有孩子在同一声令下同时开唱。同样教一首歌,前者是“一次教一个”,后者是“一次教一群”。计算机世界里的CPU也面临同样的选择:传统的标量指令一次只处理一个数据,就像独唱;而SIMD(单指令多数据)技术让一条指令同时作用于多个数据元素,就像合唱。这种“一条指令、多份数据”的运作方式,正是数据级并行(Data-Level Parallelism)的精髓——它不改变指令的执行逻辑,而是让同样的逻辑在多个数据身上同时发生。

你可能会问:为什么要费这么大劲搞并行?因为现实世界的计算,尤其是图像、音频、数值模拟和AI推理,大量操作是“对一整批数据做同一件事”——把一个数组里的每个像素都加上亮度,把一列数字全部乘以权重。这类任务数据之间互不依赖,天生适合合唱。此时与其让CPU循环几千次挨个处理,不如一次让寄存器吞下多个数据、一条指令全部搞定。

AVX-512把这种并行能力推到了新的高度。它的512位向量寄存器一次可以容纳16个32位整数或8个64位浮点数,并行度由寄存器总宽度与单个数据元素宽度的比值决定:

这就是合唱团的“人口密度”:舞台宽度固定,每个孩子占的位置越小,能同时上台的人就越多。理解了这个思想,你再看任何SIMD指令,都会发现它只是在问同一个问题——这一声“预备——唱”,到底有多少孩子在同时发声。

N=Ww=51232=16\displaystyle N = \frac{W}{w} = \frac{512}{32} = 16
这个公式说明:寄存器越宽、元素越窄,一次能“同台演唱”的数据就越多。
  1. 向量宽度 WW代表向量寄存器一次能装下的总位宽,AVX-512中W取512位。
    W=512\displaystyle W = 512
  2. 元素宽度 ww是单个数据元素的位宽,例如处理32位整数时w=32。
    w=32\displaystyle w = 32
  3. 并行通道数 N总宽度除以元素宽度,得到一条指令同时处理的元素个数。
    N=Ww=51232=16\displaystyle N = \frac{W}{w} = \frac{512}{32} = 16

512位向量寄存器:合唱团的超大舞台

指挥要组织一场大规模合唱,第一件事是准备好足够大的舞台。AVX-512为此搭建了32个512位宽的向量寄存器,名字从zmm0排到zmm31——这是x86世界里最宽的通用数据舞台。每个zmm寄存器就像一条长512厘米的站台,可以按需要划分成若干“站位”。如果每个孩子(元素)占32厘米宽,这条站台能站16人;如果每个孩子占64厘米,就只能站8人。寄存器本身不知道谁是大人谁是小孩,它只负责提供一条固定宽度的站台,由指令来约定怎么划分。

从容量上看,512位换算成字节是64字节——相当于16个32位整数、8个64位双精度浮点,或者64个8位字节。换算关系很简单:

寄存器有了,你可能会琢磨:32个超宽寄存器是什么概念?在进程的视角下,它们是线程上下文的一部分。操作系统在进程或线程切换时,需要把这32个zmm寄存器连同其他状态一起保存和恢复——如果换进来的线程也要做向量计算,老线程的“合唱队形”就得原封不动存好,避免串台。这也是为什么“进程与线程管理”课程里会专门讲SIMD寄存器:它们是CPU为每个线程准备的“排练场地”,切换线程就是切换整场排练。

既然站台这么宽,怎么保证16个孩子唱得整整齐齐、不跑调?答案是给每个人下发独立的指令牌——这就是掩码寄存器的用武之地。

512 bit=64 Byte\displaystyle 512\ \text{bit} = 64\ \text{Byte}
一个zmm寄存器能装下64字节的数据,相当于一条站台同时容纳一支小型合唱队。
  1. 位与字节换算1字节等于8位,因此把512位除以8就得到字节数。
    512÷8=64\displaystyle 512 \div 8 = 64
  2. 32个寄存器的编号zmm0到zmm31共32个,编号从0到31,便于指令直接寻址。
    0≤zmmidx≤31\displaystyle 0 \leq \text{zmm}_{idx} \leq 31

掩码寄存器k0-k7:指挥手里的点名册

全员合唱虽然气势磅礴,但有时指挥只想让一部分人唱:比如高音部先开嗓、低音部待命。这时指挥需要一本点名册,在上面逐人标记“唱”或“停”。AVX-512的掩码寄存器k0-k7,就是CPU为向量指令准备的点名册——一共8本,每本64页,每一页对应向量寄存器里的一个数据元素。当一条带掩码的向量指令执行时,掩码寄存器里第i位的值,直接决定第i个元素通道是参与运算还是原地待命。

掩码的用法有两种典型模式,理解它们就像理解点名册上的两种批注。第一种是归并模式:被选中的元素写入新结果,没被选中的元素保留目的寄存器的原值——相当于没被点名的人继续唱自己的原调。第二种是清零模式:没被选中的元素直接清零——相当于被点名“闭嘴”,而且彻底噤声。数学上可以写成条件选择:

有了点名册,指挥就不再需要“一刀切”地命令所有人统一行动。掩码让向量指令拥有了逐元素级别的精细控制力——这正是AVX-512相比早期SIMD最关键的进步之一。例如在循环尾部处理剩余元素时,掩码可以优雅地屏蔽越界的通道,而不用把循环拆成两段。点名册做好了,接下来面对的问题是:舞台太大了,小排练也非要用整条站台吗?

ri={ai,ki=1dsti,ki=0(归并)\displaystyle r_i = \begin{cases} a_i, & k_i = 1 \\ \text{dst}_i, & k_i = 0 \end{cases} \quad (\text{归并})
ri={ai,ki=10,ki=0(清零)\displaystyle r_i = \begin{cases} a_i, & k_i = 1 \\ 0, & k_i = 0 \end{cases} \quad (\text{清零})
掩码的每一位控制一个数据元素,归并保留原值,清零强制归零。
  1. 元素下标 ii表示第几个数据元素,它同时对应掩码寄存器里的第k位。
    i∈{0,1,…,N−1}\displaystyle i \in \{0, 1, \ldots, N-1\}
  2. k_i=1 表示选中当掩码第i位为1,源数据a_i被写入结果寄存器。
    ri=ai,ki=1\displaystyle r_i = a_i, \quad k_i = 1
  3. k_i=0 表示跳过归并模式下结果保留目的寄存器原值dst_i;清零模式下结果写0。
    ri=dsti (归并)或ri=0 (清零)\displaystyle r_i = \text{dst}_i \ (\text{归并}) \quad \text{或} \quad r_i = 0 \ (\text{清零})

VL子集:可伸缩的舞台

如果只是排练一个四重唱,却把整个合唱团的512位大舞台全搬出来,既浪费又笨拙。AVX-512的VL(Vector Length)子集就是为了解决这个问题推出的:它允许AVX-512指令在128位和256位的向量长度上运行,分别对应xmm和ymm寄存器家族。换句话说,指挥可以按需把舞台缩到四分之一或二分之一,而不是每次都必须用满512位。小演出用小块站台,大合唱再用整条站台,调度起来游刃有余。

VL子集还带来一个关键特性:掩码机制在128/256位长度下同样有效。这意味着你可以用一本“小号点名册”精确控制4个或8个元素的启停,而不是只能在16个元素的大编组里挥舞。这在处理数据宽度不均的循环中是极大的便利——好比指挥手里拿着不同格数的点名册,队伍多长就撕多长,绝不浪费。

给定向量长度L与元素宽度w,并行元素数n的计算方式不变:

从操作系统的角度看,VL子集还降低了上下文切换的负担:如果一个线程只需要128位的向量计算,系统只需保存/恢复xmm寄存器,节省了保存超大zmm寄存器的时间开销。舞台可大可小,演员的“体型”也各不相同。我们接下来看看两种按数据宽度划分的“声部”——BW和DQ子集。

n=Lw,L∈{128,256,512}\displaystyle n = \frac{L}{w}, \qquad L \in \{128, 256, 512\}
VL子集让同一套AVX-512指令在128、256、512位三种舞台上通用,掩码能力全程在线。
  1. 可选向量长度 LAVX-512VL允许L取128、256或512位,对应xmm、ymm、zmm寄存器。
    L∈{128,256,512}\displaystyle L \in \{128, 256, 512\}
  2. 元素个数 n用向量长度除以元素宽度,得到该长度下的并行元素数。
    n=Lw\displaystyle n = \frac{L}{w}
  3. 具体算例当L=256且w=32时,一条指令同时处理8个32位元素。
    n=25632=8\displaystyle n = \frac{256}{32} = 8

BW子集:童声部的大合唱

合唱团里最灵动的是童声部:孩子们个子小、站得密,同样长的站台能容纳更多小歌手。AVX-512的BW(Byte and Word)子集就是为“小体型的元素”设计的,它专门处理8位字节与16位字的整数运算。因为每个元素占位小,512位的站台上可以站下64个8位元素或32个16位元素——想一想,同样一声“唱”,几十个孩子同时发声,吞吐量相当可观。

BW子集的实际价值在于字符密集型计算:字符串扫描、字节级筛选、像素格式转换、位图操作,都离不开对大量8位/16位小数据的批量处理。没有BW,这些数据得先扩展成32位再计算,既浪费带宽又白白扩大寄存器占用。有了BW,CPU可以像指挥带着一队童声直接开唱,不用强行让小孩穿上大人的衣服。

通道数的计算依然是简单的除法:

童声部虽然人多,但合唱不能只有童声。当需要浑厚有力的低音、宽广大气的和声时——比如处理高精度浮点和大整数——就得请出成人部:DQ子集。

n8=5128=64,n16=51216=32\displaystyle n_{8} = \frac{512}{8} = 64, \qquad n_{16} = \frac{512}{16} = 32
BW子集把512位分成64个8位通道或32个16位通道,让小整数也能享受SIMD的合唱红利。
  1. 8位字节元素按每元素8位划分512位寄存器,得到64个并行通道。
    n8=5128=64\displaystyle n_{8} = \frac{512}{8} = 64
  2. 16位字元素按每元素16位划分,得到32个并行通道。
    n16=51216=32\displaystyle n_{16} = \frac{512}{16} = 32

DQ子集:成人部的宽声线

如果说BW是童声部,那么DQ(Doubleword and Quadword)子集就是合唱团的成人部:处理32位双字与64位四字的数据元素。成人声部站得开、嗓门大,每位成员占的位子更宽——64位双精度浮点,一个元素就占64厘米的站台,512位站台只能站下8人;32位浮点能站16人。人数少了,但每个人的“信息量”更大,精度更高。

DQ子集广泛应用于科学计算与AI推理:32位浮点数的矩阵运算、64位双精度的数值模拟、大数据量的长整数统计,都依赖这种“宽声线”的向量化。此外,很多AVX-512的混洗、转换指令也建立在DQ基础上,因为32/64位是浮点运算的基本粒度。用指挥的话说:童声负责轻快的小调,成人声部则撑起厚重的主旋律。

对应的通道数同样一目了然:

舞台有了,点名册有了,声部也分好了。但合唱团排练要出效果,还差最后一步——把独唱谱改编成合唱谱。这就是向量化编程要做的事。

n32=51232=16,n64=51264=8\displaystyle n_{32} = \frac{512}{32} = 16, \qquad n_{64} = \frac{512}{64} = 8
DQ子集让512位舞台在32位元素下站16人、在64位元素下站8人,兼顾并行度与精度。
  1. 32位双字元素按每元素32位划分,得到16个并行通道。
    n32=51232=16\displaystyle n_{32} = \frac{512}{32} = 16
  2. 64位四字元素按每元素64位划分,得到8个可容纳双精度浮点的宽通道。
    n64=51264=8\displaystyle n_{64} = \frac{512}{64} = 8

向量化编程基础:把独唱谱改成合唱谱

有了512位舞台、掩码点名册和BW/DQ分声部,CPU已经万事俱备,只欠一份“合唱谱”。在真实工程中,这份谱子由两条路径产生:一是编译器自动向量化——编译器分析循环后发现“这段旋律可以分成多个声部同时唱”,便自动生成SIMD指令;二是程序员用内建函数(intrinsic)手写合唱谱,手动指定用哪条向量指令、哪个掩码。无论哪条路,前提都是数据在内存中排布得整整齐齐——16字节、32字节或64字节对齐,让CPU能一次性把整块数据搬上站台,而不是东拼西凑。

向量化的理论加速比看起来很诱人——理想情况下,它等于并行通道数:

为什么达不到理想值?回到合唱团的比喻:就算每个声部都准备好了,如果谱架上的谱子没摆齐,或者声部之间互相等来等去,排练效率依然上不去。内存带宽就是那条连接仓库与舞台的搬运通道,数据对齐就是谱架的摆放。在AI场景中,矩阵乘、卷积、批量归一化这些“全员大合唱”型运算,正是SIMD最理想的用武之地;而频繁分支、数据依赖强的“独唱段”,向量化收益就有限。理解这些,你才算是真正读懂了SIMD/AVX-512这台“硬件合唱团”的完整乐谱。

Sideal=n=Ww\displaystyle S_{ideal} = n = \frac{W}{w}
理想情况下,向量化代码的加速比接近并行通道数;但现实中受内存带宽、数据搬运和指令开销影响,实际加速比会打折扣。
  1. 理想加速比假设向量化没有额外开销,加速比等于并行通道数n。
    Sideal=n\displaystyle S_{ideal} = n
  2. 通道数由宽度比决定寄存器总宽度除以元素宽度,得到n。
    n=Ww\displaystyle n = \frac{W}{w}
  3. 实际加速比更低受内存带宽、掩码开销、数据未对齐等因素限制,实际加速比小于理想值。
    Sreal<Sideal\displaystyle S_{real} < S_{ideal}

AI 应用场景

图像与视频处理:像素级大合唱

阶段:数据预处理与特征提取

解决的问题:图像由海量像素组成,每个像素的RGB值做亮度调整、色彩转换、缩放等操作时,传统标量循环要逐个像素处理,慢如独唱排练。AVX-512的512位寄存器一次可装下16个32位像素通道,配合BW子集可批量处理8位色深数据,掩码寄存器还能精确控制边界像素,避免越界处理。

具体案例:视频编码器在转换色彩空间(如BT.709转BT.2020)时,对每一帧1920×1080的像素矩阵做矩阵乘法。用AVX-512的DQ子集一次处理8个双精度像素分量,编码一帧的速度提升3-5倍。

数据库批量聚合计算:让整列数据同时开唱

阶段:特征工程与在线分析处理

解决的问题:在数据分析和特征统计场景,经常需要对一列数值求和、求均值、找最大值。传统逐行扫描相当于让数据库一行行“独唱”,效率低下。AVX-512的向量化聚合指令一次处理16个32位数值,把多行数据装入同一个zmm寄存器并行计算。

具体案例:某OLAP引擎在计算数亿行销售记录的月度总额时,用AVX-512的向量化归约指令替代标量累加,查询耗时从800毫秒降到120毫秒。

AI推理引擎中的算子优化:矩阵乘法的系统编排

阶段:模型推理与算子实现

解决的问题:深度学习推理的底层计算(卷积、全连接、Attention)本质是大规模矩阵乘法,数据排布规整、无分支,是SIMD的天然主场。AVX-512的512位寄存器加掩码寄存器,让算子库可以同时计算多个输出通道,并用掩码处理通道数不整除的边界情况。

具体案例:某推理引擎在优化Transformer的QK^T注意力打分时,用AVX-512的向量化乘加指令一次性完成8个浮点的乘累加,配合数据对齐将算子延迟降低40%。

Python 演示

python22 行
import numpy as np def simd_add_with_mask(a, b, mask, width=512, elem_bits=32):    """模拟一条带掩码的AVX-512向量加法指令."""    n = width // elem_bits    a = np.asarray(a, dtype=np.int32)[:n]    b = np.asarray(b, dtype=np.int32)[:n]    mask = np.asarray(mask, dtype=np.int32)[:n]    result = np.zeros_like(a)    result[mask == 1] = a[mask == 1] + b[mask == 1]    return result if __name__ == "__main__":    a = np.arange(16, dtype=np.int32)    b = np.full(16, 10, dtype=np.int32)    mask = np.array([1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0], dtype=np.int32)    r = simd_add_with_mask(a, b, mask)    print("源数据 a   =", a.tolist())    print("源数据 b   =", b.tolist())    print("掩码   k   =", mask.tolist())    print("结果   r   =", r.tolist())    print("未选中位置保持 0(清零模式)")
目的:用NumPy模拟一条AVX-512向量加法指令的掩码行为——16个元素通道同时计算,但只有掩码位为1的通道写入结果。
  1. n = width // elem_bits用512除以32,算出16个并行通道,相当于zmm寄存器站下16个32位元素。
  2. result[mask == 1] = a[mask == 1] + b[mask == 1]只有掩码选中的通道执行加法并写入,其余保持0,这就是清零模式的核心逻辑。
  3. np.asarray(a, dtype=np.int32)[:n]把输入数据规整成32位整数数组并截断到16个通道,模拟向量寄存器“一次只能装下n个元素”的物理约束。
  4. print("结果 r =", r.tolist())输出直观看到前4个和后2个位置被更新,其余为0,复现演示动画里的掩码视觉。
  5. if __name__ == "__main__":提供可执行入口,直接运行就能看到掩码逐元素控制的效果。

常见误区

误区我以为AVX-512只是把寄存器从256位加宽到512位,其他和AVX2差不多。写代码时只要把数据类型改宽,就能自动获得两倍性能。

正解AVX-512是一次体系结构的全面升级:新增了zmm0-zmm31共32个512位寄存器,新增了k0-k7掩码寄存器及整套掩码指令,还按数据宽度划分了VL、BW、DQ等子集。它不只是“舞台变大”,还配了新的点名册和分声部体系。改数据类型不会自动生成AVX-512指令,需要编译器支持或手写内建函数。

为何常见:因为寄存器位宽是最直观的数字,人们容易把注意力全放在"512"这个数字上,而忽略掩码和子集这些配套机制。

误区我以为k0-k7是8个一位的标志位,用来表示“开/关”,就像8个布尔变量,正好对应k0到k7共8个名字。

正解k0-k7是8个64位宽的掩码寄存器。每个掩码寄存器里有多位,每一位对应向量中的一个数据元素,而不是一个寄存器对应一个元素。对于512位向量和32位元素,一个k寄存器至少用16位来覆盖全部通道。k0在某些指令里还有“全选”的特殊语义。它是一本64页的点名册,不是8个开关。

为何常见:寄存器名字从k0到k7,一共8个,初学者很容易把这8个名字误解为8个位,忽略了“每个k寄存器本身有64位”。

误区512位寄存器能装16个32位整数,所以一条指令顶16条标量指令,程序整体应该快16倍。我的代码跑得没这么快,一定是编译器优化没开对。

正解理论加速比S=16是理想上限,实际受多个因素制约:数据要从内存搬到寄存器的带宽限制、向量指令本身的延迟、掩码判断开销、以及CPU在高负载向量运算下的频率下降(AVX-512功耗较大,CPU可能降频)。在真实程序中,加速比通常只有2-8倍,甚至更低。性能优化要看整体瓶颈,不能只看指令宽度。

为何常见:人脑习惯做“单因素归因”,看到16个通道就期望16倍,忽略了内存带宽和功耗墙这些系统级约束。

误区我以为AVX-512VL是给不支持512位的老CPU提供向下兼容,让它也能跑AVX-512指令。老机器只要更新BIOS就能用上VL子集。

正解VL子集不是软件向下兼容,而是指令集的长度扩展:它在支持AVX-512的新CPU上,允许指令以128位/256位长度运行,并让掩码机制在xmm/ymm上生效。目的是让程序在小数据量场景不用强行凑满512位,同时降低上下文切换的保存开销。硬件必须原生支持AVX-512VL,老CPU无法通过软件获得。

为何常见:“兼容”这个词容易让人联想到老设备,而VL的“可变长度”又很像旧指令集的长模式,两者叠加产生了误解。

面试题

Q1. AVX-512的向量寄存器位宽是多少?

单选题 · easy

  • A.128位
  • B.256位
  • C.512位← 正确答案
  • D.1024位

答案:C。AVX-512的核心特征就是512位宽的zmm寄存器。128位对应xmm,256位对应ymm,512位才是zmm。想象合唱团的舞台宽度,zmm是最大号的整条站台。

Q2. 掩码寄存器k0-k7在向量指令中起什么作用?

单选题 · easy

  • A.存储循环次数
  • B.逐元素控制数据的参与与否← 正确答案
  • C.保存内存地址
  • D.记录CPU状态标志

答案:B。掩码寄存器k0-k7是“点名册”,每一位对应一个数据元素,决定该元素是被选中参与运算、归并保留原值,还是清零。它不存计数、地址或状态标志。

Q3. 一条512位的AVX-512指令,最多能同时处理多少个32位整数?

单选题 · easy

  • A.4个
  • B.8个
  • C.16个← 正确答案
  • D.32个

答案:C。并行通道数等于向量宽度除以元素宽度:512÷32=16。就像512厘米的站台,每32厘米站一个孩子,最多站16人。

Q4. 在归并模式下,掩码为0的元素通道结果是什么?

单选题 · mid

  • A.强制清零
  • B.保留目的寄存器原值← 正确答案
  • C.写入源数据
  • D.产生溢出异常

答案:B。归并模式中,掩码位为1的通道写入源数据a_i,掩码位为0的通道保留目的寄存器原值dst_i。清零模式才会写0。这相当于点名没点到的人继续唱原调。

Q5. AVX-512VL子集的主要作用是什么?

单选题 · mid

  • A.让指令在128/256位长度下运行← 正确答案
  • B.支持8位字节元素
  • C.支持64位浮点运算
  • D.增加寄存器数量到64个

答案:A。VL子集允许AVX-512指令在128位和256位长度上运行,对应xmm和ymm寄存器,同时保留掩码能力。BW管8/16位元素,DQ管32/64位元素,都不属于VL的职责。

Q6. 一个zmm寄存器可以容纳多少字节的数据?

单选题 · mid

  • A.16字节
  • B.32字节
  • C.64字节← 正确答案
  • D.128字节

答案:C。512位换算成字节是512÷8=64字节。就像一条512厘米的站台可以容纳64个1厘米宽的“字节级小人”。

Q7. 用512位寄存器处理64位双精度浮点数,一次能并行几个元素?

单选题 · hard

  • A.4个
  • B.8个← 正确答案
  • C.16个
  • D.64个

答案:B。并行通道数=512÷64=8。64位双精度浮点是“成人声部”的大嗓门,占位宽,一条站台只能站8人。DQ子集正是为这类宽元素设计的。

Q8. 下列关于掩码归并与清零模式的说法,正确的是?

多选题 · mid

  • A.归并模式保留未选中元素的原值← 正确答案
  • B.清零模式将未选中元素置为0← 正确答案
  • C.归并模式和清零模式的结果完全相同
  • D.掩码按数据元素逐位控制← 正确答案

答案:ABD。归并保留原值、清零写0,两者结果不同,所以C错。掩码的每一位精确控制一个数据元素,A、B、D正确。想象点名册上“保留原调”和“彻底噤声”是两种不同批注。

Q9. 关于AVX-512BW子集,下列说法正确的是?

多选题 · hard

  • A.支持8位字节元素← 正确答案
  • B.支持16位字元素← 正确答案
  • C.512位寄存器可分64个8位通道← 正确答案
  • D.主要用于高精度科学计算

答案:ABC。BW子集处理8位字节与16位字,512÷8=64个通道,512÷16=32个通道,适合字符、像素等小整数处理。高精度科学计算通常是64位浮点,属于DQ子集的领域,D错。

Q10. 关于AVX-512VL子集的特点,正确的是?

多选题 · extreme

  • A.允许在128位xmm寄存器上使用AVX-512指令← 正确答案
  • B.允许在256位ymm寄存器上使用带掩码的指令← 正确答案
  • C.掩码机制在128/256位长度下依然有效← 正确答案
  • D.使用VL子集的程序必须把数据扩展到512位

答案:ABC。VL子集的意义就是让AVX-512指令以128/256位运行,掩码照常生效,无需填满512位。D恰好说反了:VL的目的正是避免“小演出也要用大舞台”,让程序按需选择站台长度。