# 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)