大忙人系列-程序猿在想什么 (二) 并行

一. 并行
過完了套娃,接下來就是第二部分,想了想,就決定是你了!
《七十億人類》繼承了前作《人力資源機器》的風(fēng)格,玩家需要解決自己的人力分布并解開計算機里面的難題,需要將已過剩的人類合理的搭配進行資源與工作的分配。游戲中將包含60 個以上的編程謎題,包含全新的編程語言。《人力資源機器》是基于單線程的編程語言,而《七十億人類》有一個能讓許多工人們一起執(zhí)行的全新編程語言。
——百度百科
當年聽說“明日公司”Tomorrow Corporation出了這個第二作后立刻就上sbeam買了??上зI晚了,當初剛出的時候還附帶第一作,結(jié)果第一作還是等遲些時候才補的票。
先不論游戲性如何,至少片頭動畫從頭到尾充斥著灰色的幽默。
機器:“你是勤勞的工人、礦工、咖啡廳雇員?讓機器來代替你吧!”
人:“但是我要好薪水的工作!工作!”
機器:“你要工作?那好,周一就有大量的工作了!”
某個人:“我有Ph.D學(xué)位?!?/p>
旁白:“沒錯,任何就算最沒用的人都能派上用場!”
大家好,我叫狗蛋,從上一家公司被辭退以后,信了機器人“所有人都能有工作!”的我去了新的公司。一如既往的按照墻上貼的指令進行操作就可以,依舊是小學(xué)生都能操作的簡單問題。只是,在指令中充斥著:“從洞跳下去!”“把自己扔進碎紙機!”以及隨時隨地都有可能出現(xiàn)的爆炸事故。雖然比起之前的工作危險了許多,不過因為高薪,我挺喜歡現(xiàn)在的工作的。或許是因為之前996福報修的夠多,我成功被提拔到了最后一層——計算機要求我們?nèi)繌亩蠢锩嫣氯ィ⑶易詈笠粋€人要說“再見”。而我,就擔(dān)任了這滿載榮耀的職務(wù)。
“再見,人類?!?/p>
二. 編程模型與游戲性
個人感覺,第二作的模型設(shè)計著實差勁,處處都充斥著作為一個計算機人不應(yīng)該有的不嚴謹。這可能是為了降低入門門檻而故意為之的也說不定,但是無論如何個人還是挺反感的。在第二作中,不能間接訪存,甚至不能直接訪存——你只能通過人物在空間中的位置以及周圍的局部上下文來決定是不是你需要的那個數(shù)據(jù)塊。其次,這作的程序不可能停下來,哪怕某一時刻得到正確的結(jié)果,而下一時刻又破壞掉了,而也算作是成功過關(guān)。不少關(guān)卡里面,想過關(guān)甚至還要靠隨機游走加工數(shù)據(jù)塊,也就是說“正確的答案”在運氣不好時也是會跑出“超時”的。
雖說第二作的模型依舊是圖靈完備的(最簡單的,肯定能模擬生命游戲),但是作為程序,不魯邦,也不知道何時停機,在并行程序中居然需要用指令執(zhí)行時間來分配不同角色的任務(wù),這種代碼怕已經(jīng)是已經(jīng)爛到不能再爛了,甚至可以用理論錯誤但是部分數(shù)據(jù)能正確執(zhí)行比例超過50%依舊算過關(guān)的算法,也有出現(xiàn)程序正確但是無奈時運不濟結(jié)果算作“超時”的程序。
個人是感覺十分荒謬。
游戲中,程序是對每個人進行編程。每個人并不知道自己的名字,也不知道自己的編號,唯一能做的就是偵測環(huán)境、猜自己干什么活。地板上的位置能記,但是不能獲得索引,也就是不存在對數(shù)據(jù)進行“劃分”的算法——除非默認就給你分好叫你這么做。每個人只能進行簡單的計算、分支判定、記憶最近的某種物件、簡單的移動或者搬放數(shù)據(jù)塊,以及同步。同步功能其實也是如同紙糊的一樣,因為只能和相鄰的人同步,或者跟所有人同步;只有部分算法專門考慮到了,才會派上用場。這個游戲比起設(shè)置謎題然后用模型去解答,更像是知道了模型的不足和痛點然后想辦法繞開去出題一樣。
總體而言,雖然整體而言還算是個不錯的游戲,也許是因為對第一代的人力資源機器過于中意有較高期待導(dǎo)致第二作沒預(yù)想的那樣產(chǎn)生落差而已。
三. GPGPU&SIMT
網(wǎng)上非常喜歡用“大學(xué)教授”和“小學(xué)生”來比喻CPU和GPU。雖然這么講淺顯易懂,但是感覺有種看不起GPU的意思。雖然這是個科普(大霧)文,但是也不打算做些普通科普文干的事情,這里就不做什么形象化比喻了。GPU的模型就是SIMT,和CPU完全不同,用CPU想法寫GPU程序的墳頭草都N米了。
現(xiàn)在我們重新回到“明日公司”,發(fā)現(xiàn)之前設(shè)計那一坨不健全各種bug充斥的指令集的技術(shù)人員已經(jīng)因為“以危險方式危害公共安全”的兜底罪被抓走了,上頭問過了幸存者狗蛋得知了部分“可能會很方便的”指令作參考,重新找了那個“沒什么用”的計算機Ph.D設(shè)計,出現(xiàn)了新的指令集?,F(xiàn)在讓我們走進公司看看吧。
墻上貼的依然是一張紙,不過所有的地板都已經(jīng)貼上了標記,從0,1...一直到...管他多少反正貼上了標記,已經(jīng)可以告訴任意一個員工編號讓他自己去拿數(shù)據(jù)了。現(xiàn)在,每32個員工都穿上了統(tǒng)一的衣服被分作一組,叫做Warp,或者你叫他32體同心也行。若干個Warp會分到一個白板,這些Warp內(nèi)的任意員工都可以操作這個白板。因為白板是一個二維的表格,而且比較窄,所以當有人在寫0號格子的時候,會順帶擋住下面的4號、8號、12號...的格子,其他人是看不到也沒法操作這些格子,但是0號格子是都看得到的(因為可以廣播)——這就是Bank Conflict。
現(xiàn)在,任務(wù)下來了,所有人都走到監(jiān)工那里去,領(lǐng)取自己的組號和個人編號(Scheduling),就可以按照紙上寫的工作了。只不過,有一點要求,那就是32體同心的人必須時時刻刻執(zhí)行同一條指令——其他人不動,則你也不能動——即其他人if判斷進了分支你沒進你也不能動要等他們?nèi)缓蟮絜lse就是他們等你——這也是GPU程序的瓶頸之一。各種科普文介紹GPU,介紹Cuda,介紹OpenCL,寫了無數(shù)個矢量求和,也就只能寫矢量求和了因為簡單。不考慮Warp和Bank Conflict寫并行程序就是在耍流氓。當然,GPU的并行和CPU的并行很不一樣就是,CPU各種同步、通訊、原子操作代價都很低,但這些在GPU內(nèi)無疑都是高昂的代價。
如果是真的用SIMT的模型的話,說不定游戲里面很多代碼就硬核起來了,但是因為本身指令通用性強,哪怕并行度不高的代碼也是可以用、看的,感覺這才真正有一種“70億人”的感覺。