0. 背景介绍
小弟在美国念MS 但念的不是纯软而是Computer Architecture
目前在硅谷的ARM工作四年半
一开始是做ML Processor的Architecture/Microarchitecture Prototype
写各种处理器的model然后做实验 然后设计两三年后的ML处理器该长什么样子
两年前因缘际会开始碰了LLVM上的一种新的infrastructure - MLIR
prototype的目标从专用处理器转向了ML compilation stack
简单来说我们设计了一个新的Mid-level IR for ML backend target - TOSA
然后实现在LLVM/MLIR上
最后我们做的所有东西基本上都开源到了Tensorflow跟LLVM的upstream github repo上
另一部分则开源到了ARM自家的开源网站上
算是不小心点了很多原本没想到的技能树
一直以来都对写前后端的纯软没兴趣 本来也没有想要丢
刚好一个月前被Linkedin推了一下这个缺
发现JD很符合我正在做的事情就丢了
本来也没打算换工作所以只丢了这一个
leetcode也只在onsite前三天内刷了10题左右
属于佛系找工作法
但靠着不小心点的技能树成功转职到水果公司变成compiler engineer
1. 面试
A. Phone 1 - 过履历
没什么特别的 应该是之后的manager 纯粹过一下履历而已
B. Phone 2 - Coding interview
开始之前面试官先murmur说Leetcode上的问题基本上都没什么屁用XD
然后问各种C++的features(主要是OOP相关):
- polymorphism pattern
比如说什么情况要用virtual method以及C++是如何实现virtual的
为什么polymorphism里的destructor一般情况都是virtual
- template跟metaprogramming
- const class method
- move semantics
然后要我自己随便写一些example这样
example能跑然后解释一下发生什么事情就好
[碎碎念]平常写处理器模型都有在用所以还行
幸好没问variadic template或一些C++14后的features
不然我也是死XD
C. Onsite 1 - Domain specific question
问Deep learning里面的quantization
- 解释int8 quantization怎么运作的
- pre-training quantization怎么做? fake-quant node要记录那些资讯
- post-training quantization怎么做
[碎碎念]我自己其实没有任何real-world network training的经验
平常是大组里面的另一个组在做
好险平常大meeting没有完全放空所以大致上还算懂
D. Onsite 2 - Coding interview
一样先抱怨Leetcode的问题大多都没屁用(到底是有多气XD)
Build a simple directed graph (from scratch)
然后graph至少要有AddEdge(), AddNode(), RemoveEdge(), RemoveNode()
注意一下各种node跟edge的关联 在加减node跟edge的时候记得会有连动
脑中有图应该就没什么太大问题
E. Onsite 3 - Domain specific question
给一个简化过的ML处理器
题目有给ALU的MACs, DMA bandwidth 然后给一个conv2d的workload
问:
- 什么优化都不做 要花多少cycles
- tiling是什么?
- 各种指令(execution/DMA) 有了tiling之后怎么做pipeline
- 假如对input height/width做了2x2的tiling能变快多少
F. Onsite 4 - Domain specific question
问更多ML处理器的optimization
- 又问了一次tiling 问说跑conv2d的时候为什么kernel不是1x1的时候会有overhead
- input stationary跟weight stationary的差别
- cascading是什么? 好处跟限制分别是什么?
[碎碎念] E跟F前两年的处理器建模的经验帮助很多
当时不是直接做compiler optimization但model也必须支援
所以基本上都有碰过
G. Onsite 5 - Coding interview
这个就是问类似Leetcode的问题
想像一个一维数线
然后定义
struct Interval {
int start;
int end;
};
input给std::vector<Internal>
每一个input的Internal可以重叠
问说所有Internal union之后
新的区间std::vector<Internal>是什么
[碎碎念] 应该是很基础的问题
但因为平常没刷题当下又很紧张
我就用了最笨的方法
因为都是整数点 所以创了一个std::vector<bool>去纪录
先扫过所有的input Intervals就能知道
[min(input), max(input)]之间的整数点是否被interval覆蓋
然后再用这个vector去reconstruct output
H. Onsite 6 - Coding interview
先问了MLIR跟LLVM的问题 比如说什么是SSA
然后跟1-D一样 要我写一个Directed Graph
不一样的点是可以假设基本功能有了
要怎么做Dead Code Elimination(DCE)
口头解释了一下用DFS的话怎么做
但最后我选择直接找to_nodes.empty()做recursive
我其实很不习惯别人看着我写code所以我写很慢XD
还没写完时间就快用完了 但他有懂我要做什么所以说这样就可以了
I. Onsite 7 - 聊天(?)
大组的Director
基本上只是在问我履历上的事情
老实说每一个面试大概都45分钟
因为他们每一个人都对我在ARM做的open source MLIR project很有兴趣
每个面试官都花了20-30分钟问我在做什么XD
剩下的真的被问问题的时间其实不多
算是满幸运的
2. 谈offer
我一开始面试前被HR问说有没有在找别的公司
很傻很天真的说没有XD
后来不小心看到levels.fyi有offer negotiation service
手痒就花了500美金买了XD
advisor建议你还是要说你有在面别的公司 就算你没有也能说是刚开始面
才不会被吃得死死的
后来也按照他的建议算是谈到了不错的offer
建议也在美国找工作的人也能试试看
以上经验希望能帮助到一些人
谢谢收看