cmodel模拟器开发
cmodel模擬器開(kāi)發(fā)
對(duì)于一個(gè)公司來(lái)說(shuō),產(chǎn)品的設(shè)計(jì)周期就是生命線,一般來(lái)說(shuō)都會(huì)在設(shè)計(jì)功能級(jí)仿真的c-model后直接轉(zhuǎn)向RTL設(shè)計(jì)。
在目前的技術(shù)下,做cycle-by-cycle的設(shè)計(jì)和直接RTL設(shè)計(jì)的時(shí)間,感覺(jué)是差不太多的。nVidia同時(shí)維護(hù)functional and timing 的simulators。
第一個(gè)model是否能跑流行的game也是一個(gè)問(wèn)題。
需要快速的開(kāi)發(fā),debug,不然就又到下一代產(chǎn)品了。
維護(hù)一個(gè)好的team,做算法,做架構(gòu)的,做電路的,做實(shí)現(xiàn)的,互相討論,互相了解彼此的領(lǐng)域。
用什么語(yǔ)言倒是無(wú)所謂,在大家討論出結(jié)果時(shí),各個(gè)工作組都有實(shí)現(xiàn)方案了,而且每組都可以用自己最熟悉的工具。
對(duì)于一個(gè)公司來(lái)說(shuō),產(chǎn)品的設(shè)計(jì)周期就是生命線,一般來(lái)說(shuō)都會(huì)在設(shè)計(jì)功能級(jí)仿真的c-model后直接轉(zhuǎn)向RTL設(shè)計(jì)。
對(duì)于GPU性能分析(Graphics Pipeline Performance Turing),就不一樣了。用RTL來(lái)跑的話,不但占用License,而且比較耗費(fèi)時(shí)間。對(duì)于一個(gè)不是特別大的公司來(lái)說(shuō),License還是比較貴的。如果RTL跑起來(lái)比較浪費(fèi)時(shí)間的話,做性能分析的,一定會(huì)多開(kāi)幾個(gè)不同參數(shù)的RTL同時(shí)運(yùn)行,一般來(lái)說(shuō),開(kāi)個(gè)七八個(gè)任務(wù)同時(shí)運(yùn)行測(cè)試場(chǎng)景是很正常的,如果一個(gè)組有好幾個(gè)Performance Turing工程師,就要占用好幾十個(gè)NCverilog License,而且還要占用相同數(shù)量的CPU時(shí)間。除了NV/AMD/Intel這種不在乎license數(shù)量的公司以外,小公司里別人還干不干活了。
Cmodel又不帶時(shí)序,需要一個(gè)帶有時(shí)序的Cmodel,對(duì)于公司內(nèi)部某些特定需求的團(tuán)隊(duì)(比如性能調(diào)優(yōu)相關(guān)的項(xiàng)目組)還是有意義的。
如果只是function 驗(yàn)證,可以用 verilator 來(lái)跑, 可用 systemc 來(lái)加速模擬 verilog 的行為, 之后再根據(jù)synthesis RTL 后的結(jié)果,分析出 critical path 部份. 就可以根據(jù)這結(jié)果修改 RTL verilog 再模擬. 其實(shí)就是不斷的模擬驗(yàn)證… ps: 不過(guò)也先要有前端的design 跟驗(yàn)證。
如果只是function 驗(yàn)證,可以用 verilator 來(lái)跑, 可用 systemc 來(lái)加速模擬 verilog 的行為。
對(duì)verilator很久經(jīng)驗(yàn)么?跟別的工程師說(shuō)過(guò)verilator,可能更相信carbon,更愿意花10w塊美刀去買(mǎi)license……。
在傳統(tǒng)的HW Design上,不外乎通過(guò)verilog 驗(yàn)證,跑跑RTL 的Function Check, 等Function 確定好后,用Design Compiler 轉(zhuǎn)出Gate Level, 在驗(yàn)證Time 是否滿足 setup time and hold time, 如不符合,就改Design,或者是改變?cè)O(shè)定的 constrain,就一直不斷的Try and Test。相對(duì)的,會(huì)花很多時(shí)間在Debug上面。軟件不像硬件一樣,可以由斷點(diǎn)分析,用software break 的方式,做Inside Register的 Debug。除非在HW中加入JTAG的機(jī)制。用ICE 來(lái)Emulator HW內(nèi)部的flip-flop所暫存的值, 但在HW Design 初期, 根本不可能會(huì)把JTAG做進(jìn)去,能不要每天加班就好了。在初期只能用NC-SIM 來(lái)模擬,看看Waveform寫(xiě)些TestBench去測(cè)。這樣一來(lái)一往就話費(fèi)了不少時(shí)間,如果能夠用更快速的驗(yàn)證方式,通過(guò)軟件來(lái)驗(yàn)證硬件的結(jié)果, 就可以減少在Design所花費(fèi)的時(shí)間。
性能模型用處不大。
在設(shè)計(jì)中考慮性能的地方主要有:
1.設(shè)計(jì)方案的時(shí)候,這時(shí)候是要把性能計(jì)算好的。如果這里沒(méi)有計(jì)算好,后期就麻煩大了。
2.開(kāi)發(fā)時(shí)候,嚴(yán)格按照方案來(lái)做,可能會(huì)有一些方案沒(méi)有想到的地方,及時(shí)反饋,修改。這時(shí)候按照方案里面的計(jì)算框架應(yīng)該對(duì)開(kāi)發(fā)有指導(dǎo)意義的。
3.測(cè)試的時(shí)候。在功能測(cè)試完畢后,但是這時(shí)候?qū)τ谛阅芤呀?jīng)幾乎沒(méi)有什么能改進(jìn)的了。
所以做方案的時(shí)候一定要把性能計(jì)算好。越到后期修改的可能性越小。
在上面三個(gè)階段中,第一階段主要是計(jì)算(計(jì)算可以用模型來(lái)仿真,覺(jué)得得不償失,超大邏輯除外)。第二階段是沒(méi)有時(shí)間和精力來(lái)做性能仿真的。第三階段應(yīng)該fpga/asic已經(jīng)完成了,性能仿真模型其實(shí)沒(méi)有什么意義了,在實(shí)際的芯片上測(cè)試,比仿真模型要真實(shí)/快速/實(shí)際多了。
隨著GPU可編程越來(lái)越靈活,人工計(jì)算的靜態(tài)性能評(píng)估已經(jīng)不那么有用了。很多時(shí)候性能和程序的特性相關(guān),必須要針對(duì)主流應(yīng)用來(lái)做優(yōu)化,沒(méi)有統(tǒng)計(jì)的方法,很難量化這個(gè)數(shù)據(jù)。只有拿到了主流應(yīng)用的量化數(shù)據(jù),才能優(yōu)化和分配流水線上的資源。比如大多數(shù)應(yīng)用對(duì)于“存儲(chǔ)器訪問(wèn)”和“數(shù)據(jù)計(jì)算”比例是平均訪問(wèn)一次存儲(chǔ)器后計(jì)算50條指令,那就要分配計(jì)算資源和緩存資源的比例,包括考慮到Cache尺寸多大才能滿足一個(gè)合適的命中率,要支持多深的Non-blocking Cache訪問(wèn)才能隱藏延遲,并且不至于耗費(fèi)太多的帶寬,而這些都和應(yīng)用的特性有關(guān)。如果這個(gè)比例在未來(lái)的主流應(yīng)用中改變了行為,那還要變換參數(shù)。這個(gè)通過(guò)手工沒(méi)有辦法算出來(lái),只能實(shí)際測(cè)試。
如果非常容易手工計(jì)算的話,那么像NV這樣的公司,有上千個(gè)GPU架構(gòu)師(GPU Architect)。設(shè)計(jì)的第一代卡性能也是非常不靠譜的,往往要等到第二代第三代卡的時(shí)候才能有一個(gè)比較滿意的設(shè)計(jì),包括功耗和性能權(quán)衡。而這種優(yōu)化離不開(kāi)性能模擬器。
對(duì)很多GPU供應(yīng)商來(lái)說(shuō),同樣如此,比如客戶需要更高性能的芯片,那好,為了使性能提高一倍,需要把流水線寬度(注意是寬度不是長(zhǎng)度)增加4倍,并且顯存帶寬(bandwidth of video memory)增加數(shù)倍才可以。但是這里面就有一個(gè)落差,就是性能不能隨著并行度的增加線性增長(zhǎng),這里面必然有瓶頸。那此時(shí)怎么辦?怎么調(diào)整流水線的負(fù)載平衡(load banlance),靠手算么?流水線上每一級(jí)都是程序控制的,如果不分析程序在不同Stage都耗費(fèi)了多少Cycle的話,那怎么知道哪里是瓶頸呢?首先,第一步要找到性能瓶頸,然后第二步才是改進(jìn)。
怎么找?用手上的ASIC來(lái)找性能瓶頸,也許可以,但是這需要足夠數(shù)量的performance counter,這個(gè)在設(shè)計(jì)制造之初有么?現(xiàn)在就算假設(shè)有,那么第二步,怎么知道那種改進(jìn)方案是最優(yōu)的呢?可能需要不斷地嘗試,比如,增加或者減少不同片上資源的數(shù)量,比如某個(gè)Cache的尺寸,某個(gè)FIFO的深度,或者是BUS上某個(gè)Local memory的容量,等等。從而調(diào)節(jié)流水線的負(fù)載平衡。而ASIC都是定制好的,怎么調(diào)?怎么觀察性能的改變?難道用加速器么,加速器的編譯時(shí)間本身就是很長(zhǎng)。也許可以增量編譯。但是加速器大家都在搶,首先要保證功能驗(yàn)證的需求,可能分給性能調(diào)試組的機(jī)時(shí)都非常少了,根本不夠用。 如果在服務(wù)器上面仿真還要占用License,會(huì)導(dǎo)致很多麻煩,仿真時(shí)間長(zhǎng)不說(shuō),而且七八不同參數(shù)嘗試的實(shí)例同時(shí)跑,性能調(diào)試組N個(gè)人一起這么干,別人就別干活了。
性能模擬器就是為了完善這個(gè)而產(chǎn)生的,第一代產(chǎn)品只是為了搶市場(chǎng),而第二代和第N代等后續(xù)產(chǎn)品,才是真正成熟的產(chǎn)品。而憑經(jīng)驗(yàn)給參數(shù)的做法,在可編程器件上不那么好使,雖然不到和拍腦袋的那個(gè)級(jí)別,但是也是不夠用的。架構(gòu)級(jí)別不優(yōu)化,結(jié)果產(chǎn)品出來(lái)功耗性能差,上面要發(fā)飆的。所以,做精細(xì)的性能模擬器,也是不得已而為之的事情。因?yàn)檫@是真正的可編程設(shè)備(programmable device),不是一個(gè)視頻編解碼那種不可編程的專用集成電路設(shè)計(jì)(ASIC Design)。
之前以為靠流片來(lái)改進(jìn)性能很笨拙,一個(gè)MP4的公司,改進(jìn)性能/驗(yàn)證性能改善結(jié)果的做法是頻繁流片,瘋狂的時(shí)候一個(gè)月流一次。
(又是一個(gè)不用C Model來(lái)改進(jìn)性能的例子)
不過(guò),比較好奇這種做法:
- 每次流片的成本大概多少?
- 對(duì)項(xiàng)目來(lái)說(shuō),實(shí)際效果如何?(畢竟理論上ASIC的可見(jiàn)度,沒(méi)有C Model可見(jiàn)度高,也許通過(guò)分析算法,在ASIC的某些關(guān)鍵點(diǎn)做performance統(tǒng)計(jì))。
首先,直接silicon級(jí)別的性能統(tǒng)計(jì)?那需要插很多性能計(jì)數(shù)器(performance counter)吧,不然怎么觀測(cè)呢?分析方法是什么呢?
其次,投片(tape-out)一次最快流程也要1個(gè)月,但是這需要大晶圓廠才可以,比如SIMC或者TSMC,小的成本更低的晶圓廠往往都走三個(gè)月的流程。
以前還有門(mén)海(gate-sea)技術(shù)實(shí)現(xiàn)的投片,就是在襯底上吧晶體管都預(yù)先排列好,然后在沒(méi)有客戶的情況下預(yù)先生產(chǎn),最后不同的客戶只需要在預(yù)先準(zhǔn)備好的襯底上,光刻出來(lái)不同的金屬連線就可以了(就好像蛋糕店預(yù)先生產(chǎn)好蛋糕坯子,不同的客戶就擠出來(lái)不同的奶油圖案一樣),所以流程更快(比一個(gè)月還要短),不過(guò)貌似在深亞微米級(jí)別好像沒(méi)見(jiàn)過(guò)了,是不是因?yàn)榫€延遲增加的緣故。
最后,投片成本,5平方毫米的MPW一般五萬(wàn)到十萬(wàn),能到0.18個(gè)工藝吧(不知道最近行情怎么樣)。不過(guò)還有封裝費(fèi)用(如果管腳不多,可以直接封裝在版子上降低成本),
另外,覺(jué)得如果需要2次MPW投片才能調(diào)整出來(lái)一個(gè)好的性能,那也就是2個(gè)月時(shí)間。有兩個(gè)月時(shí)間,都可以直接調(diào)好C model性能模擬了,從而改進(jìn)RTL了。并且方法學(xué)可以集成到下個(gè)項(xiàng)目中,好處多多。除非大這個(gè)項(xiàng)目組身兼好幾個(gè)項(xiàng)目,所以這樣做是為了省時(shí)間,破財(cái)免災(zāi),不然老板就冤大頭了。
性能模擬器能不能得到正確的書(shū)性能分析數(shù)據(jù),這個(gè)在CPU性能模擬器這個(gè)問(wèn)題中很常見(jiàn)。的確是需要按照需求來(lái)設(shè)計(jì)。
比如,對(duì)于傳統(tǒng)的OGL ES1.1來(lái)說(shuō),沒(méi)有復(fù)雜的數(shù)據(jù)回路,流水線基本都是生產(chǎn)者-消費(fèi)者關(guān)系,那么首先對(duì)于一個(gè)新項(xiàng)目而言,要解決的問(wèn)題就是在這些Stage 之間插入多少深度FIFO,才能做到流水線復(fù)雜均衡(load balance),這就是需求。像之前Cqq大牛描述那種私有框架,在基本的需求就在于此。
而現(xiàn)代GPU越來(lái)越復(fù)雜,如果用學(xué)術(shù)名詞描述GPU架構(gòu)的話,基本上可以說(shuō)是“多核心的多線程向量處理器陣列”,不再像傳統(tǒng)圖形流水線,大大增加了性能模擬器的設(shè)計(jì)難度。從復(fù)雜性角度來(lái)說(shuō),的確在這種情況下就應(yīng)該把性能模擬器和功能模擬器完全分開(kāi)做。但兩者不見(jiàn)得是文件級(jí)的數(shù)據(jù)傳遞。從項(xiàng)目進(jìn)度的角度考慮,還是推崇由性能模擬器調(diào)用功能模擬器的方式。對(duì)于一個(gè)粗粒度的性能仿真來(lái)說(shuō),也許這需要在功能模擬器中多放置一些bool變量,這些只能標(biāo)志位用于告訴性能模擬器,那些運(yùn)算功能被使用到了。
最近考慮這個(gè)問(wèn)題,主要是針對(duì)一款芯片更早的性能調(diào)整和性能分析(performance analyzing & tuning)。在傳統(tǒng)的固定功能圖形水流線(fixed function graphics pipeline)上,可以依照簡(jiǎn)單的帶寬計(jì)算公式和經(jīng)驗(yàn)來(lái)設(shè)計(jì)芯片,而不需要更多的測(cè)量流水線之間是否滿足于性能平衡。因?yàn)樵诠潭ü芫€下,圖形API調(diào)用程序的行為變換是很有限的,而存儲(chǔ)器帶寬和固定功能的計(jì)算公式就可以獲得很好的預(yù)估精度。
但是在當(dāng)前GPGPU的角度越來(lái)越近的情況下,這一情況發(fā)生了很大變化,面向通用計(jì)算(或是說(shuō)流計(jì)算)后,無(wú)論是OCL還是Shader程序行為不再像固定功能圖形流水線API那樣的死板,變得非常靈活,從而使得可編程圖形流水線(programmable graphcis pipeline),使得程序可以寫(xiě)出千變?nèi)f化的效果。這導(dǎo)致傳統(tǒng)的靠手工靜態(tài)計(jì)算的性能分析,變得不再可靠。必須更細(xì)致的更量化的考慮當(dāng)前大部分程序的行為,以及未來(lái)可能出現(xiàn)的程序行為,從而決定如何改進(jìn)GPU,如何分配片上門(mén)電路資源(resource of gate-level circuit on-chip)給不同的流水線階段(pipeline stage)。這就使得設(shè)計(jì)一個(gè)性能模擬器,在編寫(xiě)下一個(gè)版本的RTL之前是非常有必要的事情,對(duì)于IP供應(yīng)商來(lái)說(shuō),這也有助于在制作好RTL釋放包(release package)后,針對(duì)客戶不同應(yīng)用,給出不同的IP配置建議。
但是這里又有一個(gè)新問(wèn)題,就是傳統(tǒng)來(lái)說(shuō),在設(shè)計(jì)GPU C-Model的時(shí)候一般都不會(huì)加cycle信息在上面,傳統(tǒng)的GPU c-model主要就是作為驗(yàn)證流程(verification flows)中黃金參考模型(golden reference model)來(lái)使用,驗(yàn)證平臺(tái)(testbench)只需要針對(duì)不同的流水線階段(或是模塊)寫(xiě)出來(lái)不同的無(wú)周期行為級(jí)模型(或是硬件算法模型)就可以,不需要帶有任何周期信息。所以,一般來(lái)說(shuō)當(dāng)前部分GPU設(shè)計(jì)公司都指揮維護(hù)一個(gè)不帶有周期信息的GPU c-model。但是這個(gè)cmodel只能做功能仿真(functional simulation),并不不能做性能仿真(performance simulation)。
對(duì)于一個(gè)公司來(lái)說(shuō),產(chǎn)品的設(shè)計(jì)周期就是生命線,一般來(lái)說(shuō)都會(huì)在設(shè)計(jì)功能級(jí)仿真的c-model后直接轉(zhuǎn)向RTL設(shè)計(jì),而不是在進(jìn)行一個(gè)時(shí)鐘精確(cycle-accurate cmodel)的性能模擬器設(shè)計(jì),在產(chǎn)品進(jìn)度上這是不允許的。而且維護(hù)兩個(gè)c-model這也會(huì)導(dǎo)致公司運(yùn)營(yíng)的成本增加,并且項(xiàng)目管理的難度也大大增長(zhǎng)!所以需要一個(gè)快速的性能模擬器方案。使用功能模擬器跟蹤(trace)出來(lái)每個(gè)GPU獨(dú)立模塊模塊,所接受到的圖形軟件程序的代碼流,比如那些三角形觸發(fā)了切割(cliping)操作哪些觸發(fā)了剔除(culling)操作。這個(gè)trace出來(lái)的信息被送入一個(gè)單獨(dú)的性能模擬器,這個(gè)性能模擬器不能執(zhí)行程序,只能根據(jù)trace出來(lái)的代碼流來(lái)積累時(shí)鐘周期,從而計(jì)算出來(lái)流水線延遲和瓶頸。這樣,就可以在原有的c-model上利用原有的資源來(lái)最小程度上獲得一個(gè)早期的性能分析數(shù)據(jù)。并且把管理和維護(hù)成本做到最小。
這個(gè)性能模擬器可以使用systemc來(lái)實(shí)現(xiàn),就是相當(dāng)于一個(gè)大的計(jì)數(shù)器,針對(duì)不同的執(zhí)行來(lái)累加不同的時(shí)鐘消耗,而不需要填寫(xiě)任何與時(shí)序和執(zhí)行流水線無(wú)關(guān)的 無(wú)關(guān)的功能算法。systemc的TLM可以很容易的實(shí)現(xiàn)這個(gè)功能。
總結(jié)
以上是生活随笔為你收集整理的cmodel模拟器开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MXNet 图优化与算子融合
- 下一篇: TVM图优化与算子融合