Nvidia编译器工程师面试经验
我的背景:在我的论文中,我在编译器前端(Clang)工作,开发了一个类似编译器的工具,用于 C 语言的静态分析。基本上是 C 编程语言的 linter。我来自一级学院 (IIT)。我有 1 年以上的经验。
招聘经理回合:他曾在 NVIDIA 的 GPU 编译器优化团队工作。谈到了他所做的与编译器优化有关的事情。问了关于编译器优化的问题,比如循环优化和窥孔优化,因为我知道他来自优化团队,我提前准备了这些东西。但我明确告诉他,我从未在优化领域工作过。注意:编译器优化是一个编译器后端,您还需要与架构相关的知识。
第一轮:编码
- 打印字符串的所有排列?我告诉他改变问题,因为我没有为这次采访修改回溯。
- 他很谦虚地改变了这个问题。
- 用详细的运行时分析对链表进行合并排序?
- 我成功回答了这个问题,但在分析运行时出错了。我实现了将链表分成两半并合并两半并递归应用快速排序的方法,我告诉他这是错误的 O(n^2)。但即使他不知道我在分析中犯了一个错误,他一直在建议一种将其减少到 O(N log N) 的方法,这是错误的。
- 如何实现hashmap?为映射键定义散列函数的可能方法?
第 2 轮:编码
- 在二叉树中找到最小元素?
- C 代码从句子中提取单词并将其复制到每行包含一个单词的二维数组。代码有点复杂。在那里,他通过打断整个句子来复制字符串,并且如果分配的内存少于之前分配的内存,则确实进行了内存操作以处理内存不足的情况。
E.g:
I/p: Nvidia is a cool organization.
O/p: Nvidia
is
a
cool
organization
- 有一个 3×3 矩阵来存储应用程序,例如
A1 A2 A3
A4 A5 A6
A7 A8 A9
- 您需要维护此矩阵中的前 9 个应用程序。你会怎么做?
- 现在除此之外,他什么都没有提。我没有问他任何问题,而是提出了一个错误的解决方案。我说我会用优先队列来做。然后他说优先级队列将如何工作,所以我向他解释了在堆中插入和删除节点 20 分钟,然后他说“哦”,但它不会保持顺序对吗?我就像什么。他说你能想到其他的数据结构吗?
- 然后又在思考了 10 分钟后,我说我将使用链表和地图来存储它。基本上就是实现 LRU 缓存标准问题。一天前我看到了,但当时无法考虑。我告诉他我将如何实现它,他没有要求我编写代码,这次采访就完成了。
第三轮:设计技巧
- 在乘以 2 个非常大的矩阵的情况下,如何减少缓存未命中?我无法回答,因为我不知道在这种情况下缓存将如何工作。
- 然后他问了一个很长很神秘的编译器相关问题。它是这样的……
- 假设编译器 A 调用编译器 B 的“调用”模块 15 次,在此期间它执行一些步骤,其中消耗的时间百分比被写入旁边
Initializing a compiler instance 15%
Preprocessing 25%
Syntax analysis 25%
Optimizations 35%
- 您将如何最大限度地减少所消耗的时间?现在,你从这个问题中得到了什么?
- 我需要赚 15% 到 10% 吗?减少时间是什么意思?我花了 25 分钟从面试官那里澄清问题。基本上,他想知道我们是否需要为所有 15 个调用初始化编译器实例,或者我们是否需要一次又一次地执行预处理?
- 所以在我终于理解了这个问题之后,我成功地回答了他所有的问题。我告诉他我们可以检查编译器是否已经初始化。我们可以将参数传递给调用函数以获取编译器实例。我们可以存储一个映射来存储与预处理器相关的数据,并且可以使用标志来了解语法分析是否已经完成,然后他问后续问题,例如我们是否可以删除条件,然后我说检查映射大小和其他内容。所以基本上我很好地处理了他的问题。
第四轮: Clang 知识
- 这是最明智的采访。她向我询问了有关我的项目的所有细节,以及我是如何解决这个问题的,以及我使用了哪些数据结构和设计模式。
- 所以基本上她对这项工作很感兴趣,因为我的项目做得很好,所以我知道她问我的每一个问题。
第 6 轮:编译器总监轮(文化契合)
- 他问了一些关于我的项目的问题,比如你为什么想加入这个困难而无聊的领域。基本上,在他失去动力之后,我决定不想加入这个领域。
- 一周后,他们说他们对编码轮次不满意,因此他们希望再进行一轮编码。
第 7 轮:编码
给定一棵树,将其转换为求和树?
例如:2 19
/ \ / \
3 4 ——-> 15 4
/ \ / \
5 7 5 7
- 我给了他 O(n^2) 的方法。他想把它减少到我做不到的 O(n) 。
判决:拒绝。
结论:
我感到很放松。因为他们在 2021 年 5 月联系了我,并安排了 2021 年 9 月 17 日的第一轮比赛,因为他们没有空位,所以他们在最后一刻将其重新安排到了下周。感谢上帝,我没有提前离开我现在的组织。然后在面试当天,第一轮没有发生,因为那个人不在。编码人员没有给出任何提示。最后一个面试官太可怕了。问完这个问题,他变得死一般的沉默。他说话的时候,语气中带着太多的傲慢。请不要留下这样的人来满足他们的自我。感谢上帝,我没有正确回答。