寒武紀AI晶片軟體工程師面試經歷:CUDA+算子開發+晶片架構全考察
2年AI晶片軟體經驗,詳細復盤寒武紀三輪技術面試全過程,涵蓋C/C++基礎、CUDA程式設計、算子開發與優化、晶片架構理解、模型部署等核心考點,附真題彙總與備考建議。
背景介紹
我本科是計算機科學專業,研究生方向是高效能運算,畢業後在一家AI晶片創業公司做了2年的軟體工程師。主要工作是CUDA算子開發和模型適配,也參與過推理引擎的優化。寒武紀一直是國內AI晶片的標竿企業,所以看到他們招AI晶片軟體工程師,我立馬就投了。
說實話,投完之後心裡挺忐忑的,畢竟寒武紀的技術要求很高,而且AI晶片軟體這個方向競爭也很激烈。大概等了一週多,HR聯繫我約面試,說一共三輪技術面。我花了一週時間把CUDA程式設計、算子開發、晶片架構這些內容系統過了一遍,還把之前做的幾個算子優化專案整理成了PPT,方便面試的時候展示。
面試流程復盤
一面:C/C++ + CUDA基礎(約1小時)
一面是一位看起來30出頭的工程師,應該是組裡的技術骨幹。先讓我自我介紹,然後就開始問基礎了。
C/C++部分:
第一個問題就讓我有點意外——「請說說C++中虛函式表的實現原理,以及多重繼承下虛函式表的變化」。這個我之前複習過,從vptr指向vtable、單繼承下vtable的佈局、多重繼承下多個vptr分別指向不同vtable一路說下來。面試官追問了虛繼承下的vtable變化,這個我答得不太完整,只說了虛繼承會引入vbptr,面試官補充了虛基類表的具體結構。
然後是記憶體管理——「C++中new/delete和malloc/free的區別?placement new的用法?」我從建構/解構呼叫、型別安全、記憶體分配失敗處理幾個角度說了。placement new我舉了個例子,說可以在已分配的記憶體上建構物件,常用於記憶體池。
還問了智慧指標——「shared_ptr的引用計數是怎麼實現的?執行緒安全嗎?weak_ptr解決什麼問題?」我說shared_ptr透過控制塊維護引用計數,引用計數本身是執行緒安全的,但指向的物件不是執行緒安全的。weak_ptr解決循環引用問題,不增加引用計數。
CUDA部分:
面試官問的第一個CUDA問題是「CUDA的執行緒層次結構是怎樣的?grid、block、thread之間的關係?」我從SM的硬體架構說起,講到軟體層面的grid-block-thread對映,以及warp的概念。面試官追問了「warp divergence是什麼?對效能有什麼影響?」我說同一warp內的執行緒如果執行不同的分支路徑,會導致序列執行,降低效率。
然後是記憶體層次——「CUDA中有哪些記憶體型別?各自的存取速度和適用場景?」我列了global memory、shared memory、constant memory、texture memory、register,分別說了存取延遲和使用場景。面試官特別追問了shared memory的bank conflict問題,我說shared memory分為32個bank,同一warp內多個執行緒存取同一bank的不同位址會導致衝突,需要透過padding來避免。
還問到了流和事件——「CUDA stream的作用?多個stream之間如何並行?」我說stream是GPU操作的執行佇列,不同stream之間的操作可以並行執行。面試官追問了「stream之間的同步怎麼做?」我說了cudaStreamSynchronize和cudaEventSynchronize。
最後一個問題讓我手寫一個簡單的CUDA kernel——實現一個向量加法。這個比較基礎,我很快就寫完了。面試官讓我優化一下,考慮記憶體合併存取,我加了__restrict__修飾符和對齊存取的說明。
一面結束後面試官說「基礎還可以,但CUDA的優化經驗還需要加強」,讓我等二面通知。
二面:算子開發+效能優化(約1.5小時)
二面是一位更資深的技術專家,問題明顯更有深度了,而且更貼近實際工作。
開場就問了一個很實際的問題——「請說說你做過的最有挑戰性的算子優化專案」。我選了之前做的一個FlashAttention算子優化,從naive實現的問題說起——顯存佔用大、訪存效率低,然後講如何透過分塊計算、online softmax、重計算策略來優化。面試官在每個環節都會追問——「分塊大小怎麼確定的?online softmax的數值穩定性怎麼保證?重計算和儲存中間結果之間的trade-off怎麼權衡?」
然後是效能分析——「你平時用什麼工具做CUDA效能分析?怎麼定位效能瓶頸?」我說了nsight compute和nsight systems的使用,以及如何分析occupancy、memory throughput、compute throughput等指標。面試官追問了「如果發現kernel是memory bound的,你會怎麼優化?」我從記憶體合併存取、shared memory使用、資料預取幾個角度說了。
接著問到了算子融合——「算子融合的原理是什麼?有哪些常見的融合模式?」我說算子融合透過減少中間結果的顯存寫入和讀取來提升效能,常見的融合模式有element-wise融合、reduce融合、conv+bn+relu融合等。面試官追問了「融合的時候要注意什麼?」我說了資料依賴關係、計算精度、除錯困難等問題。
還問到了Tensor Core——「Tensor Core的程式設計模型是怎樣的?如何使用WMMA API?」我介紹了Tensor Core的矩陣乘加操作,以及wmma::load_matrix_sync、wmma::mma_sync等API的使用。面試官追問了「Tensor Core對資料佈局有什麼要求?」我說了row-major和column-major的對齊要求。
二面還問了一個開放性的系統設計題——「如果要你設計一個通用的算子庫,你會怎麼設計架構?」我從算子註冊、自動調優、多後端支援、計算圖優化幾個維度說了。面試官對自動調優部分很感興趣,追問了「自動調優的搜尋空間怎麼定義?搜尋策略用什麼?」
二面結束的時候,面試官說「專案經驗不錯,但系統設計能力還需要提升」,感覺是中規中矩的評價。
三面:晶片架構+專案深挖(約1.5小時)
三面應該是部門技術負責人,問題更偏架構理解和全域視野。
首先讓我詳細介紹寒武紀MLU的架構特點。說實話這部分我準備得不夠充分,只知道MLU用的是類GPGPU架構,有專門的AI加速單元。面試官看我對架構了解不深,就換了個角度問——「你了解哪些AI加速器的架構?它們和GPU的區別是什麼?」我從TPU的systolic array、華為達芬奇的Cube單元、寒武紀的MLUcore幾個方面對比說了。面試官似乎對這個回答比較滿意。
然後是模型部署的問題——「一個模型從訓練到部署在AI晶片上,需要經過哪些步驟?」我說了模型匯出、算子適配、精度校準、效能調優、端到端驗證幾個步驟。面試官追問了「精度校準怎麼做?INT8量化的精度損失怎麼評估?」我詳細說了PTQ和QAT兩種方法,以及per-channel和per-tensor量化的區別。
還問到了編譯器——「你對TVM、TensorRT這類深度學習編譯器了解多少?」我說了TVM的Relay IR、算子排程、auto-tuning機制,以及TensorRT的層融合、精度校準、kernel自動選擇。面試官追問了「如果TVM沒有某個算子的實現,你怎麼新增?」我說了自定義算子的註冊流程。
最後是幾個開放性問題——「你覺得AI晶片軟體棧最大的挑戰是什麼?」「你怎麼看MoE模型對晶片架構的影響?」這些我結合自己的理解說了,面試官一直在追問細節,感覺是在考察思考深度。
三面結束後大概一週,HR通知我通過了,整體流程還算順利。
真題彙總
C/C++:
1. 虛函式表實現原理及多重繼承下的變化
2. new/delete和malloc/free的區別
3. placement new的用法
4. 智慧指標的實現原理和執行緒安全性
5. weak_ptr解決什麼問題
CUDA:
6. 執行緒層次結構:grid、block、thread、warp
7. warp divergence及其效能影響
8. 記憶體型別及存取速度對比
9. shared memory的bank conflict
10. CUDA stream和事件
11. 記憶體合併存取優化
算子開發:
12. FlashAttention算子優化思路
13. CUDA效能分析工具和方法
14. memory bound kernel的優化策略
15. 算子融合的原理和常見模式
16. Tensor Core程式設計模型和WMMA API
17. 通用算子庫的架構設計
晶片架構與部署:
18. AI加速器架構對比
19. 模型部署流程
20. INT8量化和精度校準
21. TVM/TensorRT編譯器原理
心得建議
1. CUDA基礎必須扎實。寒武紀的AI晶片軟體崗位對CUDA要求很高,不是會寫kernel就行,還要理解底層硬體架構和優化原理。建議認真看CUDA C++ Programming Guide和CUDA Best Practices Guide。
2. 算子優化要有實戰經驗。面試官會深挖你做過的算子優化專案,每個細節都可能被追問。建議至少做過2-3個有深度的算子優化。
3. 了解目標晶片的架構。雖然面試官不會要求你對寒武紀MLU瞭如指掌,但至少要了解基本架構特點,以及和GPU的異同。這體現了你對崗位的重視程度。
4. 系統設計能力很重要。二面和三面都會涉及系統設計題,考察你能不能從全域角度思考問題。建議多看一些開源專案的架構設計。
5. 關注前沿技術。AI晶片領域發展很快,面試官會問一些前沿話題。平時多關注頂會論文和行業動態。
FAQ
Q:寒武紀面試對學歷有要求嗎?
A:技術面不會直接問學歷,但碩士基本是門檻。我面的時候感覺面試官更看重專案經驗和實際能力。
Q:沒有AI晶片經驗能過嗎?
A:有GPU程式設計經驗的話問題不大,但需要展示你對AI晶片的理解。建議提前學習寒武紀的公開文件和CNToolkit的使用。
Q:面試會問手撕程式碼嗎?
A:會。一面讓我手寫CUDA kernel,二面讓我寫算子優化的偽程式碼。建議提前練一下CUDA白板程式設計。
Q:工作強度怎麼樣?
A:據我了解,寒武紀的工作強度在晶片行業屬於中等偏上,加班是常態但不會特別離譜。
Q:薪資水平如何?
A:寒武紀的薪資在AI晶片行業屬於中上水平,加上股票期權,整體package還是不錯的。