Appearance
开放 / 项目向问题与 HPC 自检(避免只会背题)
手写/八股过关后,初面/二面常给“开发化”问题。这里给 HPC/AI-Infra 候选人一套把“我会 C++”讲成“我能做性能”的口径与自检。
一、最高频开放式问题(准备一个“代表作”回答)
- 介绍一个你最有成就的技术点(STAR 讲:背景/任务/动作/结果+数字) → 建议挑一个带量化提升的:如把热点从 X 提到 Y、延迟/吞吐数字、内存占用降幅。
- 讲一个踩过的难调 bug:怎么定位(分支→崩溃/ASan/perf/二分)、怎么修、防回归。
- 如果给你一段很慢的代码/系统,你怎么优化? → 固定流程先测量(见 performance/perf-bottlenecks 的口径),别拍脑袋说。
- 多线程吞吐上不去怎么排查 → 锁竞争?假共享?cache miss?NUMA?内存带宽?逐项给数据。
- 为什么你开发的库适配某硬件/大小后性能掉 → 向量宽度/缓存行/tile 大小/带宽墙。
二、把技术点讲“成体系”的表达骨架(HPC)
总原则:能给出“原因→现象→我们怎么量化→用了什么→提升了多少”的闭环 C++ 候选人讲性能,别只说“我加了多线程/我用了缓存”。
示例口径:
「任务:矩阵乘在 4MB L2 机器上内存受限。做法:先 perf stat 确认是 LLC miss/带宽瓶颈而非算力;改 SoA + 64B 对齐 + tiling 到 L1,并拆 8 路累加器打破依赖链,开 -O3 -march=native;block 大小扫几档取命中率最高者,用 Google Benchmark 锁规模复测。结果吞吐从 X 提升到 Y(cache-miss 从 Z% 降到 ~1%)。」
三、让“八股”变“生产级”的追问自检(每个专题挑一个自问)
- 智能指针:shared_ptr 的引用计数是原子的,代价多大?何时换 unique_ptr + 裸所有权?
- 线程池:你的池在任务风暴/慢消费者时行为?队列假共享?数核按物理核还是 SMT?
- 无锁:ABA 怎么真正避免(不是背);内存序为何 release/acquire 就够;有界队列适用性。
- allocator:对象池的对象可平凡析构吗?对齐满足?反复 grow 碎片谁管?生命周期和线程安全?
- SIMD:数据够大吗(带宽墙)?尾端/对齐/依赖链都处理了?.avx2 但在旧 CPU 会崩?
- 协程:栈分配策略、awaitable 生命周期、能否与线程池/IO 结合(衔接调度真相)。
- 模板元编程:可读性/编译时间/诊断 权衡;哪层复用真正需要模板化而非运行期。
- C++17/20:string_view/span 谁拥有内存说不清了吗?ranges 会拖慢热内核吗?
四、“卡壳了就说”式兜底三句
- “我倾向先做一次可复现 benchmark 拿数据再动手,避免凭印象优化。”
- “这条规则我有点结合不牢,我先讲我确定的部分原理:……”(诚实 + 结构化续答)
- “手写 / 极细节我不保证,但只要给我编译器和 profiler 几分钟我通常能复现它。”
五、反问面试官(显得整体性)
- 这套系统的性能瓶颈现在主要在哪一块?(带宽/延迟/同步/编译)?
- 部门对内核性能是倾向纯手写还是用库/框架之上做优化?
- 训练/推理是 per-request 吞吐还是低延迟优先——影响我的选型判断。