思朗科技 算子开发工程师 一面
- 轮次
- 一面
- 时间
- 2026-10
- 来源
- 牛客网
《面试题目》
- 自我介绍,介绍项目背景和自己负责的部分
- 项目里的算子怎么实现?做过哪些优化,为什么选择这些方案?
- 怎么定位性能瓶颈?如何判断问题出在计算、访存还是同步上?
- 优化效果怎么测?测试的 Shape、数据类型、硬件环境和计时方式是什么?
- Nsight 怎么使用?关注哪些指标,怎样根据 Profiling 结果确定优化方向?
- GPU 的存储层次,寄存器、Shared Memory、Cache 和显存的区别
- CUDA 中 Thread、Warp、Block 的关系,以及访存和线程同步相关的基础
- 结合项目追问 C++ 特性和内存管理,中间穿插了一点汇编相关内容
- 对 LLVM 和编译流程的理解
《参考解析》
算子实现与优化方案的选择:回答要落到「为什么这么选」而不是「我用了什么」。一个算子的优化手段通常有:合并访存(让相邻线程访问相邻地址,走满 cache line)、用 Shared Memory 做数据复用降低 global memory 访问、减少分支发散(warp 内不同路径会串行)、以及算子融合省掉中间结果的读写。选择依据是 roofline 分析——先算这个算子的计算密度(FLOPs / Bytes),判断它是计算受限还是带宽受限:带宽受限就优化访存(向量化、提高复用、减少中间写回),计算受限就考虑指令级优化(用更快的指令、减少冗余计算、上 tensor core)。这个「先判断受限类型再动手」的框架是面试官最想听到的。
性能瓶颈怎么定位:从粗到细。先用整体时间拆解(kernel 时间 vs 拷贝时间 vs 预处理),再进 kernel 内部。计算瓶颈的信号是 SM 利用率高、算力吞吐接近峰值、指令发射满;访存瓶颈的信号是 memory throughput 高、L2/DRAM 带宽打满、warp stall 主要在 long scoreboard(等内存);同步或延迟瓶颈的信号是 barrier stall、warp 数不足(occupancy 低)、以及大量 __syncthreads 等待。Nsight Compute 关注的指标:SM 占用率与 achieved occupancy、DRAM / L2 吞吐占比、warp 状态分布(stall 的原因)、指令吞吐、以及内存事务数(看有没有非合并访存放大)。拿到 stall 分布基本就能判断方向:等内存就优化访存或提高并行度,等 barrier 就减少同步或调整分工。
优化效果怎么测才算数:面试官追问测试条件,是因为「快了多少」这句话在没有条件的情况下没有意义。要交代清楚:Shape 与 batch(不同 shape 的最优策略完全不同)、数据类型(FP32 / FP16 / INT8 的带宽和算力差几倍)、硬件型号与 SM 数量、以及计时方式(用 CUDA Event 计时 kernel、预热若干次、多次取中位数或 p50/p99,排除第一次编译和 cache 冷启动)。对比要同条件对基线(cuBLAS / 官方实现 / 前一版 kernel),并说明正确性怎么验证(与 CPU 或参考实现比数值误差、看最大相对误差)。
GPU 存储层次与线程组织:寄存器最快但每线程数量有限(超出会 spill 到 local memory);Shared Memory 是片上、由 block 内线程共享、需要手动管理且要防 bank conflict;L1/L2 Cache 自动管理、L2 全 GPU 共享;显存(DRAM)容量大但延迟高、带宽是所有优化的天花板。CUDA 的组织是 grid 包含多个 block,block 包含多个 thread,硬件以 32 线程的 warp 为单位调度——同一个 warp 内的线程走不同分支会串行(分支发散)。block 内的线程可以通过 __syncthreads() 同步并共享 Shared Memory,block 之间默认不能同步。
C++、汇编与 LLVM:C++ 部分通常落在内存管理(RAII、智能指针、对齐与 alignas、避免频繁分配)、值语义与移动语义、以及在 GPU 编程里对内存布局的敏感度(AoS vs SoA)。汇编被追问时一般想知道你有没有看过 SASS/PTX——能说出「看寄存器使用量判断有没有 spill」「看有没有 LDG.128 向量化访存」就够了。LLVM 的部分按三段式回答:前端(Clang)把源码变成 LLVM IR,中端做与语言无关的优化(内联、循环优化、向量化、常量传播),后端做指令选择、寄存器分配、指令调度后生成目标机器码;对算子开发来说,理解 IR 的意义在于能判断一个优化发生在哪一层、以及为什么自己写的代码没有被优化掉。
这一轮的特点:面试官明显很熟悉实际开发,会顺着你的回答继续追问「瓶颈判断的依据、测试条件、方案适用范围」,把项目里值得优化的地方一起聊出来。这种面试的正确姿势是「把限制条件说清楚」——主动交代你的方案在什么 shape、什么硬件、什么精度下有效,而不是宣称普遍更快。作者最后建议投递前把简历捋清楚,其实正是这类岗位的核心:简历上每一条都要能往下讲三层,讲不清的技术栈不如不写。