天天看點

《OpenCL實戰》一1.3 類比:OpenCL處理和紙牌遊戲

本節書摘來異步社群《opencl實戰》一書中的第1章,第1.3節,作者: 【美】matthew scarpino 譯者: 陳睿 責編: 陳冀康,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

在最開始學習opencl的時候,我經常會被那些奇怪的資料結構以及各式各樣的術語所吓到。對于我而言,要記住這些術語所包含的内容以及互相間的關系并非易事,是以我采用了類比學習的方法,把opencl應用程式的運作過程比作打撲克牌。這看起來很奇怪,但個中緣由,由我慢慢道來。

撲克遊戲的結構總是一張牌桌,一個莊家加上一個或多個玩家再配上一副紙牌。玩家之間并沒有關系,他們隻是向莊家要牌,或是增加賭注。莊家挨個詢問玩家的請求,遊戲結束之後,莊家便會檢視手牌,判定勝負。

在這個類比中,莊家扮演的是opencl主機的角色,每個玩家則好比opencl相容裝置,而桌子就相當于是上下文,每副紙牌就相當于是一個核心程式。每個玩家的手牌就像是一個指令序列。表1.2更清楚地說明了紙牌遊戲和opencl應用程式的運作過程間的類比關系。

《OpenCL實戰》一1.3 類比:OpenCL處理和紙牌遊戲

為了讓這個類比更直覺,圖1.2所示的是有4個玩家時的卡牌遊戲的情景,每個人的手牌是4張。我希望通過圖1.1和圖1.2,讓這個類比更加的直覺、易懂。

《OpenCL實戰》一1.3 類比:OpenCL處理和紙牌遊戲

在下面的幾個章節裡,我們還會回過頭來再考察這個類比,并補充新的内容。這個類比雖然能讓我們可以更直覺地了解opencl的整個運作過程,但還是有些問題,下面僅列舉出我所認為的六點最嚴重的不足:

類比并沒有提及平台。而平台指的是辨別opencl不同實作的資料結構。平台也為通路裝置提供了方法。例如,你可以通過nvidia的平台來通路nvidia裝置。

紙牌遊戲中,莊家并不能選擇牌桌上的玩家,但是opencl主機卻要決定将哪些裝置放入上下文之中。

紙牌遊戲中,莊家并不能給不同的玩家派發同樣的紙牌,但是opencl主機卻可以将同樣的核心發送到不同裝置的指令序列中。

類比并沒有提及資料以及如何針對opencl相容裝置進行資料劃分。opencl相容裝置往往包含有很多個處理單元,每個處理單元隻負責處理一部分資料。主機設定完資料的次元和處理單元的數量後,資料的劃分便開始運作。

紙牌遊戲中,莊家分發紙牌給玩家,每個玩家各自負責整理自己的手牌。而在opencl中,主機完成核心和執行指令入指令序列之後,每個裝置預設的任務執行順序與核心入列的順序一緻。

紙牌遊戲中,莊家采用的是輪循排程的方法來發牌,而opencl對核心發送的方法并無限制。

如果你還是不大适應opencl的術語,别擔心,第二章我們會深入地透過代碼來了解這些資料結構。畢竟用這些東西編出代碼才是王道。下一節我們來看看opencl代碼究竟是何模樣。

繼續閱讀