阿里巴巴 AI Infra 实习 一面


Q: 什么是访存密集型算子?

访存密集型算子是指算术强度低、性能受内存带宽限制的算子。典型例子:elementwise操作(add/relu/sigmoid)、LayerNorm、BatchNorm、Softmax、transpose/reshape。这些算子计算量小但需要读写大量数据,优化方向是减少内存访问次数(算子融合)和提高带宽利用(合并访存、向量化加载)。


Q: FP32、FP16、INT8的存储格式是怎样的?

  • FP32:1位符号 + 8位指数 + 23位尾数,共32位。范围约±3.4e38,精度约7位有效数字。
  • FP16:1位符号 + 5位指数 + 10位尾数,共16位。范围约±65504,精度约3-4位有效数字。
  • BF16:1位符号 + 8位指数 + 7位尾数,共16位。范围同FP32,精度约2-3位。
  • INT8:8位定点整数,有符号范围-128127,无符号0255。

Q: 量化的原理及过程?

原理:将浮点数映射到低位整数表示,减少存储和计算开销。核心公式:q = round(x / scale) + zero_point,反量化:x ≈ (q - zero_point) * scale

过程:统计数据分布(calibration)→ 确定scale和zero_point(基于min-max/percentile/KL散度)→ 将权重/激活量化为INT8 → 推理时用整数运算加速 → 必要时反量化回浮点。


Q: GPU和CPU的结构差异及各自适合计算什么?

  • CPU:少量强大核心(数十个),大缓存,复杂控制逻辑(分支预测/乱序执行)。适合延迟敏感的串行复杂任务、分支密集逻辑、操作系统和IO。
  • GPU:大量简单核心(数千个),小缓存,简单控制。适合吞吐量导向的大规模并行计算(矩阵运算、图像处理、深度学习训推)。

Q: UDP和TCP的区别和适用场景?

  • TCP:面向连接、可靠传输(确认/重传/流控)、有序、开销大。适合网页、文件传输等需要可靠性的场景。
  • UDP:无连接、不可靠、无序、开销小、速度快。适合实时音视频、游戏、DNS查询等对延迟敏感可容忍丢包的场景。
  • 在HPC中RDMA通常基于UDP/InfiniBand实现高性能通信。

Q: Linux查找磁盘使用的指令?

  • df -h:查看文件系统整体使用情况。
  • du -sh *:查看当前目录下各文件/目录大小。
  • du -h --max-depth=1:查看一级目录大小。
  • ncdu:交互式磁盘使用分析工具。
  • lsblk:查看块设备信息。

Q: 手撕:链表判断有环?

(编程题)


Q: 手撕:CUDA实现向量加法?

(编程题)


Q: 介绍锁的概念?

锁(Lock/Mutex)是并发编程中保护共享资源的同步原语。核心思想:同一时刻只允许一个线程/进程访问临界区。类型包括互斥锁、读写锁、自旋锁、递归锁。加锁-操作-解锁模式防止数据竞争,但使用不当可能导致死锁、优先级反转、性能下降。


Q: 交叉熵损失函数的理解?

交叉熵:H(p,q) = -Σ p(x) * log(q(x)),衡量真实分布p与预测分布q的差异。在分类任务中,p是one-hot标签,q是模型softmax输出。交叉熵等价于负对数似然:-log(q_y)(y为正确类别)。值越小表示预测分布越接近真实分布。梯度形式简洁:∂L/∂z = q - p,计算高效。


Q: CUDA编程中并行性和并发性的区别?

  • 并行性(Parallelism):多个线程同时执行相同/不同操作。如一个Warp内32个线程真正同时执行同一指令(SIMT)。
  • 并发性(Concurrency):多个任务在时间上重叠执行但不一定同时。如多个kernel在不同stream中交替使用GPU资源、计算与数据传输overlap。

GPU通过大规模并行(thousands of threads)和并发(multi-stream)两者结合实现高性能。


Q: 手撕:实现SVM?

(编程题)


Q: 手撕:实现Transformer?

(编程题)