安谋科技 NPU 软件岗笔试 以 C/C++ 为主
- 轮次
- 笔试
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 单选题:以 C/C++ 语言题为主,分值占比高。
- 多选题:少选或错选均不得分,同样占较高分值。
- 简答题:代码补全。
- 简答题:缓存读写设计。
《参考解析》
题型与分值分布意味着什么:单选加多选占了大部分分值,且多选「少选或错选不得分」,等于把风险放大了一倍——不确定的选项宁可少选(如果规则是少选得分)也绝不乱选,而这里的规则是少选同样不得分,那么策略就变成「只选能明确排除到只剩确定项」的题,拿不准的题按知识边界做最优判断,不要在选项之间反复摇摆浪费时间。简答题只有两道,但代码补全和缓存设计更看重思路完整性,写的时候要把假设和推理写出来,别只填一个答案。
C/C++ 单选多选的高频考点:指针与数组的退化、const 与 volatile 的位置语义、static 的三种作用域、位运算与整型提升、sizeof 与 strlen、结构体对齐与填充、内存分区(栈/堆/全局/常量区)、动态内存的配对释放、new 与 malloc 的区别、拷贝构造与移动语义、虚函数表与多态、extern "C" 的名称修饰、预处理与宏的副作用、未定义行为(越界、悬垂指针、有符号溢出)。多选常在「下列哪些是未定义行为」「哪些操作会在编译期完成」这类题上设坑,复习时按「编译期 vs 运行期」「标准规定 vs 实现定义」两条线各整理一份清单。
代码补全题的常见考法:补全题一般给一段有明确意图的代码,挖掉关键几行或让填边界条件。常见形态有:链表/字符串的指针操作(注意 head 为空、单节点、尾节点)、位操作(统计 1 的个数、判断 2 的幂、大小端转换)、内存拷贝里的重叠处理(memmove 的方向选择)、环形缓冲区的读写索引取模、递归改迭代的栈模拟。做题时先通读全段确认不变量(谁负责释放、索引是闭区间还是左闭右开、指针是否可能为 NULL),再落笔;填完立刻用空输入、单元素、满容量三种情况走一遍。
缓存读写设计题怎么答:从参数讲到策略。先明确缓存的组织方式(直接映射、组相联、全相联)、行大小(Cache Line,常见 64 字节)、替换策略(LRU/伪 LRU/随机)和写策略(写直达 Write-Through 还是写回 Write-Back,写不命中时写分配 Write-Allocate 还是非写分配)。NPU 场景要额外说数据复用:把卷积的权重复用和特征图复用分开,用分块(tiling)让工作集落在片上 SRAM 里,用双缓冲(ping-pong buffer)把 DMA 搬运和计算重叠起来,减少对 DRAM 的访问次数。别忘了伪共享问题:多核同时写同一 Cache Line 里的不同变量会导致缓存行反复失效,解决办法是填充对齐(padding 到 64 字节)。如果要落到代码,写出地址到组号的映射公式(set = (addr / line_size) % set_count)、tag 比较和命中判定,再说明 miss 时的填充流程。