ETH官方钱包

切換
舊版
前往
大廳
主題

又是Job system

Lumi | 2015-06-16 00:36:07 | 巴幣 0 | 人氣 380

上一篇文章中,我照自己的需求實(shí)作了一個job system,其中有個功能不是很令人滿意。

假設(shè)目前有job A與job B,A做完才能做B。在上文架構(gòu)中,能夠在執(zhí)行job A時產(chǎn)生job C,且可允許C做完才會做B。但是在使用該架構(gòu)時,無法以直觀的方式達(dá)成這功能。理由是job內(nèi)部不能等待其他job完成,更精確地說是任一worker不能以任何原因等待其他worker。效率問題暫且不提,若每個worker都產(chǎn)生新的job然後等待其他worker完成該job,就沒有worker會做事了。為了減少worker等待的情況,該架構(gòu)還實(shí)作了限制特定job同時被執(zhí)行的數(shù)量。

現(xiàn)在有新的方法可以解決這些問題了,Naughty Dog在GDC 2015發(fā)表了他們的job system
裡頭提到利用Fiber使得job內(nèi)的等待動作成為可能。原理是job要等待時就把目前的fiber存起來,然後從fiber pool拉出一個新fiber來執(zhí)行別的job;要切換回等待中的job時,就把目前的fiber丟進(jìn)pool裡,再還原先前暫存的fiber。

此法可使所有worker無時無刻都在做事,且由於等待的限制解除,job程式碼的撰寫也變的更直觀。這個方法看起來太美好了,因此我又實(shí)作了一份job system。這次的實(shí)作目標(biāo)有以下幾點(diǎn):
  • 使用boost coroutine來搞定fiber機(jī)制
  • 拔掉manager thread
  • 拔掉限制特定job同時執(zhí)行數(shù)量的功能
  • 保留其他已實(shí)作的功能
由於少了manager thread來搶CPU,料想效率應(yīng)該會比上個版本還快,但測得的時間卻不如預(yù)期,乾脆趁此機(jī)會來個大改版。從如何送job給worker到worker如何取出與執(zhí)行job,實(shí)驗了許多種版本。最後程式碼大部份被改寫,核心概念改為偏向Doom3 BFG的方式,無論是傳遞job或執(zhí)行job的效率都勝過上個版本。


以下再貼一次之前的測試數(shù)據(jù)來對比新架構(gòu)的效能,設(shè)定Job數(shù)量為2000個。值得一提的是新架構(gòu)為了測試Fiber切換效率,特地新增一個job專門用來送出2000個job,並等待該2000個job完成。2000個job的程式碼與上篇文章相同。

對照組,完全不使用平行處理,測試1000次得到的平均時間
迴圈1000,需時2.359ms
迴圈5000,需時11.705ms
迴圈10000,需時23.343ms

使用我的簡化版Doom3 BFG Job架構(gòu),測試1000次得到的平均時間
迴圈1000,需時0.704ms,效能提升3.35
迴圈5000,需時3.127ms,效能提升3.74
迴圈10000,需時6.200ms,效能提升3.77

使用上篇文章架構(gòu)測試1000次得到的平均時間
迴圈1000,需時0.782ms,效能提升3.02
迴圈5000,需時3.181ms,效能提升3.68
迴圈10000,需時6.194ms,效能提升3.78

使用Fiber的新架構(gòu),2000+1個job測試1000次得到的平均時間
迴圈1000,需時0.653ms,效能提升3.61
迴圈5000,需時3.072ms,效能提升3.81
迴圈10000,需時6.084ms,效能提升3.84

這回總算是全面贏了我的簡化版Doom3 BFG,主要應(yīng)是少了job list內(nèi)sync機(jī)制的關(guān)係。Worker在衝刺job list的時候不需要每執(zhí)行一個job就檢查一次sync,也沒有被sync中斷的可能,切換job的成本可減到最低。以往一直認(rèn)為coroutine在多核心環(huán)境下無用武之處,要求效能的程式會選擇使用thread而不是coroutine,現(xiàn)在看來我錯了,而且錯得很開心。

創(chuàng)作回應(yīng)

=星之卡比=
您好,之前發(fā)現(xiàn)了這個網(wǎng)誌以後就開始定期點(diǎn)閱這裡,感覺大大都很認(rèn)真地在研究這些東西和分享一些經(jīng)驗,對正在學(xué)習(xí)的小弟來說是非常有幫助(感覺臺灣很少這種分享遊戲渲染技術(shù)的文章)。 這邊想問一下,個人在猜測Naughty Dog主要用Fiber是不是為了能容易Suspend的緣故,畢竟依照傳統(tǒng)的做法,他將Thread鎖緊HW Thread以後就可以去Job Queue裡面取得工作來運(yùn)行,不需要再另外用Fiber來封裝Job的緣故,所以在猜他之所以用Fiber當(dāng)容器是為了簡單地儲存當(dāng)下暫停所需要的Context?
2015-09-10 18:30:23
Lumi
你抓到重點(diǎn)了, Naughty Dog要達(dá)成GDC2015文件中所列的目標(biāo)
使Job可以暫時停下來是達(dá)成目的的其中一個關(guān)鍵
我目前遇到所有需要等待的狀況都可以用切換fiber達(dá)成
譬如等資源在背景讀取完、製造一堆新的job並等待它們執(zhí)行完
等別人釋放lock、等gpu執(zhí)行完...

我寫文章的初衷就是想要更多人加入3D繪圖的圈子,很高興你喜歡這些文章
考慮到現(xiàn)在正處於新舊圖形API轉(zhuǎn)換的尷尬期
加上我的r9 380沒辦法正確執(zhí)行我的OpenGL程式=_=a
所以中途變成研究別的東西,像是Raspberry Pi...
等到我的程式轉(zhuǎn)換成Vulkan後, 寫作重心才會回到渲染技術(shù)的實(shí)作心得上
2015-09-10 19:59:17
=星之卡比=
(看來小屋好像沒辦法及時更新留言,我有改掉裡面一些贅字但還是沒被更新QQ)
我個人也是在等待新世代的API,畢竟兩者的設(shè)計就如同Unity那篇所說天差地遠(yuǎn),雖然一方面也是無奈考生XD(不過我並沒有像大大那樣實(shí)作IBL或是SSAO那類的核心技術(shù),只是概念上有個基礎(chǔ)而已。換句話說就是看技術(shù)簡報看爽的(汗))

冒昧地在問下,之後有考慮公布部分的實(shí)作程式碼嗎?個人看久了文章發(fā)現(xiàn)雖然理論完善規(guī)完善,但似乎實(shí)作技巧跟有些細(xì)節(jié)似乎都會刻意被藏一手XD往往總在一些問題思考很久而不得其解,想說如果有別人的作法可以參考,或許可以讓其他跟我有類似想法的人參考交流?不過這是您的心血,當(dāng)然也可以不公開,只是想問下而已。

最後,之前看到有其他文章一直在婊AMD的OpenGL Driver沒想到不是傳聞而是真有其事XD我覺得這也是很多遊戲商不願採用OpenGL的原因吧,驅(qū)動品質(zhì)不太一致。但我想隨著新世代API的登場,一堆事情都轉(zhuǎn)到開發(fā)者上的情況下,似乎驅(qū)動要寫得太差勁也是一件難事XD
2015-09-10 20:11:34
Lumi
我沒公布實(shí)作與細(xì)節(jié)有幾個原因
其一, 我的目的一方面是讓大家對3D繪圖程式實(shí)作產(chǎn)生興趣
另一方面是掃盲, 因為太多人只憑感覺來評論遊戲畫面的技術(shù)好壞
所以我只會著重在原理解說, 提供參考資料
還有展示不同特效對畫面產(chǎn)生什麼影響

其二, 文章背後隱藏的知識可能有好幾篇論文或書本數(shù)個章節(jié)之多
我不太可能在一篇文章內(nèi)把所有事情解釋清楚
在此情形下給了實(shí)作也沒有多大意義

其三, 我在寫文章的時候有部分刻意保留, 點(diǎn)到為止
一方面使文章簡短, 一方面希望讓大家去我列出的參考連結(jié)找答案
甚至勾起興趣開始動手實(shí)作, 而不是把我的文章看完就結(jié)束了
畢竟最新技術(shù)的文件都不是中文, 大家得養(yǎng)成看英日文技術(shù)文件的習(xí)慣
所以我不會在文章內(nèi)手把手地教到會

最後, 看了文章會思考問題非常好, 歡迎提問!

目前介面是這樣設(shè)計的
typedef void(*JobFunc)(void *);

struct Job
{
JobFunc func;
void* data;
};

Job job = { (JobFunc)&JobSoundUpdate, &soundData };
JobInfo jobInfo;

jobManager->Submit(&job, 1, JT_LIFO, &jobInfo);
jobManager->Wait(&jobInfo);

JobInfo用來儲存job之間的dependency和紀(jì)錄該job是否執(zhí)行完畢
2015-09-11 00:46:04
=星之卡比=
了解,不過我沒說清楚可能引起大大誤會,我說的是那些技術(shù)簡報的資料也是一樣。通常很難幾份資料就可以搞定,得去想辦法找些別人的Code來改。
希望之後能跟大大交流,到時候還請您指教了^^
2015-09-11 17:45:14
Lumi
技術(shù)文件不會從基礎(chǔ)開始教已經(jīng)是常態(tài)了, 從頭教反而是少數(shù)
只能自己找參考資料來看, 還要找參考資料的參考資料的參考...
撐過去就是你的[e12]
2015-09-11 19:01:21
空之境
工作分配寫到最後都有種在寫os 排程器的感覺xd
2016-06-28 22:49:44
Lumi
我的實(shí)作是worker們?nèi)尮ぷ鞫皇欠峙涔ぷ鹘oworker喔
2016-06-28 23:02:29
空之境
這樣搶工作是critical section吧
2016-06-28 23:05:45
Lumi
我的實(shí)測結(jié)果是用搶的比分配法還快,你可去看doom3 BFG原始碼是怎麼搶的
2016-06-28 23:13:08

相關(guān)創(chuàng)作

更多創(chuàng)作