1.ThreadsPerBlock和Blocks的数量受哪些条件约束。
2.理论占用率怎么计算?
3.什么是warp,什么是warp divergence?
4.cuda的内存模型里有多少种memory,它们的位置(片上还是板上),带宽和延迟的相对大小?
5.global memory的访存合并是什么?
6.什么样的变量会被分配在register上?什么样的变量会被分配在local memory上?
7.Block是怎么被SM调度执行的?
8.什么是cuda core? 什么是tensor core?
9.什么是bank confict+?怎么避免bank confict,你能想到多少方法?
10.描述-下Block reduce的大致实现。
11.描述-下double buffer(ping pong buffer)的大概原理和实现。
12.什么是roofline model+?什么是memory bound,什么是computation bound?
13.kernel fusion为什么能提升性能?还有哪些好处?举几个fusion的例子。
14.gpu上有分支预测+吗?gpu上有指令集并行吗?
15.常用profile工具和方法。
16.float的计算一定比int消耗更多的cycle吗(主要是加法和乘法)?
17.常见的float格式。fp32,tf32,fp16,bf16的联系和区别?
18.ptx和sass是什么,和cuda的关系?
19.cuda上的排序和topk算法原理和实现。
20.matmul的优化,超级加分题。
21.flash attention的优化,超级加分题。

1.cpu与gpu的区别?
CPU的设计着重于处理单个线程的复杂计算和控制流程。
GPU 被设计用于高密度和并行计算,更多的晶体管投入到数据处理而不是数据缓存和流量控制
体现在GPU的ALU(算术逻辑运算单元)数量更多

2.cuda编程中的SM SP 是什么?
SP(streaming processor),计算核心,最基本处理单元
SM(Streaming multiprocessor),多个SP加上其他找资源组成一个SM

3.cuda编程的内存模型
全局内存
共享内存
寄存器

4.cuda编程的软件模型
Block,线程块
Grid,线程格
thread,线程

5.stream(cuda 流)概念的理解
主机发出的在一个设备中执行的CUDA操作(和CUDA有关的操作,包括主机-设备数据传输和kerenl执行)

6.使用共享内存时需要注意什么?
(1)线程同步
__syncthreads() 在利用共享内存进行线程块之间合作通信前,都要进行同步,以确保共享内存变量中的数据对线程块内的所有线程来说都准备就绪
(2)避免共享内存的 bank 冲突
bank 冲突概念:同一线程束内的多个线程试图访问同一个 bank 中不同层的数据时,造成bank冲突
只要同一线程束内的多个线程不同时访问同一个 bank 中不同层的数据,该线程束对共享内存的访问就只需要一次内存事务

7.对一个cuda kernel的进行优化可以从哪些角度入手

8.GPU L1/L2缓存介绍
9.同步stream和异步stream的理解

手撕
矩阵乘
softmax规约
nchw转nhwc
长度为n的数组 统计每个元素出现的频率 元素大小为0-256 统计的频率放在另一个数组里面
将数组里面的奇数位置的数放在左边,偶数位置的数放在右边,原地操作