面试时间:2023.11.13 19:00
三分钟自我介绍
工程相关
1、解释一下pipeline。
输入、推理、decode、推理结果业务处理
2、输入图片时GPU、CPU利用率上不来怎么解决。
微服务
CUDA相关
1、解释一下cuda中stream的作用?
cuda中的stream是GPU中的操作隊列。相同流串行執行,不同流并行執行。当不手动创建流时,cuda将会默认一个流操作。
stream的創建和銷毀:cudaStreamCreate、cudaStreamDestroy
stream的同步和查询:cudaStreamSyncronize、cudaStreamQuery
stream的优先级和属性设置:cudaStreamCreateWithPriority cudaStreamGetPriority
stream的错误处理:cudaStreamGetLastError cudaStreamGetEvent
stream的内存管理:cudaMallocAsync cudaFreeAsync异步的分配和释放
stream的数据传输:cudaMemcpyAsync cudaMemsetAsync异步的拷贝和初始化
stream的内核执行:<<<...>>> 或者 cudaLaunchKernel在stream中异步执行kernel函数
stream的事件管理:cudaEventCreate cudaEventDestroy cudaEventRecord cudaEventSyncronize
stream的图管理:cudaGraph创建和使用cuda图,使用cudaGraphLaunch,在steam中执行CUDA图。
这是我输入的提示让ChatGPT帮我生成的代码用于API的学习:
帮我使用cudaStreamCreate创建一个流,在该stream中我需要使用cudaMallocAsync异步分配一段内存,该内存用来存储一个数组。在我的kernel函数中给定一个数,查询数组中是否有相同的元素,查询成功并返回下标,我需要要用cudaEventCreate进行事件管理,并使用cudaGetLastError来捕捉错误信息。根据我的描述帮我生成一段cuda代码。
2、GPU的线程层次?
线程(thread):
线程是GPU上的最基本的执行单元,每个线程负责处理一部分数据,多个线程执行相同的计算任务。
线程块(block):
1、线程块是由一组线程组成的。
2、同一个线程块中的线程可以并发的在一个SM上执行,访问同一块共享内存。
3、block之间是相互独立的,不能通信和协作。
线程网格(grid):
一个线程网格中由一组线程块组成,同一线程网格中的所有线程块共享全局内存空间,可以通过kernel函数启动线程网格。
线程束(wrapper管理器):
线程束是sm上基本调度和执行单元。一个线程束包含32个线程。
一个SM上有一个或者多个线程束。
一个SP在一个时钟周期只有一个线程。
网格和块的维度:x,y,z
3、sp和sm的包含关系,各自对应软件层面、硬件层面?
SP和SM都是GPU上的硬件单元。SP是流处理器,是GPU上最基本的处理单元,每个SP负责处理一部分数据,执行相同的计算任务。
SM是流式多处理器,是由多个SP加上其他的一些资源组成的,每个SM可以并行地处理多个warp。
从以下几个维度理解SM:
基本定义:
线程束(Warp):
块与SM的关系:
资源分配:
调度与执行:
架构的差异:
重要性:
4、cuda kernel函数的优化方法?
????????根据GPU的硬件特性和核函数的特点,合理地配置线程数、块数、网格数等参数,以达到最大化并行执行和最高的占用率。
????????优化内存使用方法,尽量减少对全局内存的访问次数和重复数据的访问,利用共享内存、纹理内存、常量内存等高速缓存来提高内存吞吐量。
????????优化指令使用方式,尽量避免使用循环、分支等导致控制流发散的指令,使用模板参数、内联函数、位运算等技巧来减少指令数和提高指令吞吐量。
????????使用数学库、算法库、性能分析工具等辅助工具,如cuBLAS、cuFFT、cuDNN、nvprof等,来提供高效的数学运算、算法实现、性能分析等功能。
5、写kernel函数的时候如果分配的线程不足32个,wrapper管理器会怎么分配?
补充了解的概念
设备重叠:GPU中的设备重叠是指能够并行数据传输和内核执行,这样有利于提高GPU利用率。
设备重叠的原理是,CPU中有两个复制引擎队列,一个负责从将数据从主机拷贝到设备,一个负责将数据从设备拷贝到主机。这两个队列和内核队列可以并行或者乱序执行。从而实现数据传输和内核执行的设别重叠。
设备重叠的具体使用方法是:将cuda操作分配到不同的流中。
内存分页:内存分页是操作系统内存管理技术,将进程的逻辑地址划分成页,将磁盘的物理地址划分页框。进程访问内存时,系统将从磁盘加载对应的页到页框中,并用页表对应起来。
cuda中为什么要设计pinned memory?
pinned memory是操作系统分配在主机上固定的、不可分页的、页锁定的内存,它不会被交换到虚拟内存中。
优点:
它可以加快主机和设备间内存传输速度。不需要操作系统的分页机制访问内存,不需要主机和设备间的内存拷贝,采用直接内存访问(DMA)。
可以让GPU实现零拷贝,减少内存占用和数据传输带来的开销,提高内核执行效率。
缺点:
会占用更多的物理内存,因为它不能被操作系统释放或交换,如果分配过多的pinned memory可能会影响程序的性能。
降低GPU的内存缓存效率,因为它不会被GPU缓存,如果对pinned memory进行过多的访问,可能会导致更多的GPU-CPU数据传输,影响内核执行的性能。
因此pinned memory要根据具体的应用场景和硬件条件来权衡利弊,选择合适的内存管理方案。
加速相关:
1、pytorch onnx tensorRT生成的模型分别是动态图还是静态图?
2、tensorRT算子加速的方法有哪些?
算法相关:
1、一个模型图中有哪些网络层可以剪枝,剪枝策略是什么?
2、给我一个模型图该怎么剪?
3、了解量化原理吗?量化后一定会快吗? 量化后不快的原因是什么?
不问原理,偏向遇到了实际问题该怎么解决。
智力题:
一根香燃烧是1个小时,怎么精准测量半个小时。
算法题:
二分查找的变种
总结:需要系统充分的准备!
?