---
# System prepended metadata

title: 23-09-15-秋招-快手-祝

---

# 23-09-15-秋招-快手

岗位：机器学习平台工程师 一面挂

## 面试问题

### 1.gpu和 npu 的区别

华为NPU和GPU在编程模型方面的区别：

1. Host:运行在CPU上的主机程序,负责控制GPU的操作和管理GPU上的数据.
2. Device:运行在GPU上的设备程序,负责执行计算任务.
3. Kernel:在GPU上执行的函数,它是CUDA程序的核心部分,一个Kernel可以并行地执行多个线程.
4. Thread:在GPU上执行的最小计算单元,由于GPU可以支持数千个并行线程,因此可以利用这种并行性来加速计算任务.
5. Block:由多个Thread组成的线程块,一个Block中的Thread可以共享同一块共享内存.
6. Grid:由多个Block组成的线程网格,可以表示整个计算任务的并行性.

CUDA编程模型基于这些概念来实现GPU上的并行计算。在CUDA程序中，主机程序可以将计算任务分配给GPU进行并行处理，GPU会创建多个Thread和Block来并行执行计算任务。在Kernel函数中，程序员可以使用CUDA提供的API来访问GPU上的内存和设备，并通过线程间同步和通信来协调计算任务。通过利用GPU的并行性，CUDA可以实现比CPU更快的计算速度。

而华为NPU中仅有Host、Device、Kernel、Block概念,每一个Block为一个并行单位,为最小的执行计算的单元.Block之间通过GM进行数据共享.NPU中有多个相同的物理核心,同一时间每个物理核心调度一个Block.其中没用线程的概念,无法像GPU那样支持数千个并行线程.

### 2.gpu的底层调度，grid block超出了实际的 sm 数量，如何调度，如何映射

GPU 上有四种调度器

#### Application scheduler

通常情况下两个不同的gpu应用是不能同时占用gpu的计算单元的，他们只能通过时分复用的方法来使用gpu。**具体来讲就是gpu按照FIFO的策略依次从runlist上拿取channel进行执行，每一个channel只能运行一定的时间，等时间片用完之后就会进行切换来运行其他的channel。但是这种时分复用的调度算法有一个缺陷就是如果App每次提交的任务都比较小就无法占满gpu SM从而导致了gpu 整体使用率比较低**。为了解决这个问题，nvidia 又提出了一另外一种调试算法叫`Multi-Process Service`，我们也叫空分。在MPS的场景下它允许两个不同的应用能够在同一时刻去占用不同的gpu sm，从而来提高gpu的使用率。

#### stream schedule

当gpu从runlist里面取出channel之后会生成相应的command和数据，而每个stream里面包含了一系列的commands。由于不同的应用的stream是可以设置不同的优先级的，所以stream scheduler主要负责不同应用的stream的调度和抢占。

#### Thread Block scheduler

它主要负责将thread block assign给gpu的sm，完成thread block跟gpu sm之间的一一映射。通常能不能将一个 kernel的thread block assign给某个sm主要看SM上的计算能力。举个例子，假如说一个sm支持 2048 threads和32 blocks，那么如果某个kernel有64个threads和64个blocks则scheduler也只能选这个kernel一半的blocks去运行。

#### warp scheduler

通常情况下一个warp包含了32个thread，warp scheduler的主要作用就是从wrap中获取准备好的待执行的instruction，并把这些instruction分配给sm上的Disaptch Unit。接着Dispatch Unit会把这些指令发送到SM的SIMD core上执行。



thread block scheduler 负责将 grid 中的 block 调度到 sm 上，如果 block 数量超过了 sm 的数量，那么调度器就会进行分时调度，先运行一部分 block，之后再运行剩下的 block。

### 3.gpu上如何实现双缓冲

同一个 warp 中需要进行多轮循环取不同数据 双缓冲才有意义。

同样在共享内存上开辟两个缓冲区，每一轮循环的时候，先往其中一个缓冲区写入下一轮循环所需要的数据，然后中另一个缓冲区中读取数据进行计算，从而达到计算和数据读取的并行。

### 4.nordered_map 和 map 的区别 各有什么优点

1. map：
   - 优点：
     - map元素有序（这是map最大的优点，其元素的有序性在很多应用中都会简化很多的操作）；
     - 其红黑树的结构使得map的很多操作都可在O(logn)下完成；
     - map的各项性能较为稳定，与元素插入顺序无关；
     - map支持范围查找。
   - 缺点：
     - 占用的空间大：红黑树的每一个节点需要保存其父节点位置、孩子节点位置及红/黑性质，因此每一个节点占用空间大。
     - 查询平均时间不如unordered_map。
   - 适用场景：
     - 元素需要有序；
     - 对于单次查询时间较为敏感，必须保持查询性能的稳定性，比如实时应用等等。
2. unordered_map
   - 优点：
     - 查询速度快，平均性能接近于常数时间O(1)；
   - 缺点：
     - 元素无序；
     - unordered_map相对于map空间占用更大，且其利用率不高；
     - 查询性能不太稳定，最坏时间复杂度可达到O(n)。
   - 适用场景：
     - 要求查找速率快，且对单次查询性能要求不敏感。

## 手撕代码

[有序矩阵中第 K 小的元素](https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/)

给一个 n*n 的矩阵，每行和每列都是按升序排列，求矩阵中第 k 小的元素。要求复杂度小于(n2)