在cpu-gpu異構框架下遍歷固定半徑內鄰居的自適應并行算法
【技術領域】
[0001]本發明屬于高性能計算領域,具體地說是一種基于自適應并行方法在CPU-GPU異 構框架下的新的遍歷固定半徑內鄰居的并行算法,涉及到SIMD架構,GPU硬件特性,異構平 臺下的任務調度與負載均衡,數據交互策略,計算機圖形學以及仿真等。
【背景技術】
[0002] FNN問題是處理在多維度歐幾里德空間中,所有在給定距離內的點與點之間的交 互的問題。而固定網格算法是其中最被廣泛使用的方法,特別是在數值方法中。這個算法廣 泛應用于自然環境的模擬,生物仿真,行為模擬以及三維重建。通過這個算法,可以將構建 鄰居信息的時間復雜度降到〇(wn)(如果使用不基于比較的排序算法),而遍歷鄰居的時間 復雜度降為〇(3 kwnN),其中w是排序關鍵字長度,η是空間中點的數量,k是空間維度,N是每 一個單元格中點的數量的上限。
[0003] 為了提升上述算法的性能,一個可行的方案是在多核處理器,特別是諸如GPU這種 S頂D加速器上來實現上述算法。由于這個算法非常適合并行化,因此在GPU上已經有了一些 針對這個算法比較成熟的并行模型。并且這些傳統的并行模型能夠在點密度比較低的情況 下得到非常好的性能。在傳統并行模型中,GPU內核程序的線程網格中所包含的線程數量是 和空間中點的數量是相同的。然后這些線程被直接劃分為包含線程數量相同的幾個線程 塊,然后在GHJ中以這些線程塊為單位進行調度運算。每個線程所作的工作就是讀取它們所 負責的那一個點的一個鄰居點的信息然后做一些運算,如此循環直到所有鄰居都訪問到 了。每個線程塊的工作就是讀取其所負責的所有點的所有鄰居,并做相應的運算。
[0004] 然而,隨著點密度的提升,傳統的并行模型的性能下降得非常厲害。這是由于傳統 方法會帶來一個線程塊中的不同線程的負載不均衡以及內存訪問的不一致。這是由于這種 簡單的線程劃分策略導致的:一個線程塊內的線程所負責的點往往會分布在幾個不同的單 元格中,而不同單元格中的點的鄰居以及鄰接單元格中點的數量都是不一致的,從而導致 串行化的內存訪問以和分支的產生。并且由于這種不一致性,很難利用GHJ中的層次線程和 存儲單元的特性。圖1就展示了傳統并行模式下的狀況,其中網格塊是代表了在當前循環中 有點正在被訪問的單元格,虛線方塊是已經被訪問過的單元格,c是一個線程塊所負責點所 分布的單元格的數量,這個迭代循環會持續次,其中nc是鄰接單元格的數量, nPlj是線程塊內第j個單元格的第i個鄰接單元格中點的數量。
[0005] 另一方面,隨著GPGPU技術的不斷發展,在一些諸如⑶DA和OpenCL這些主流的 GPGPU平臺上,自適應并行技術(在這些主流平臺上被稱為動態并行)被逐漸得到支持。而這 個技術能夠使得計算資源按需分配。從而避免了上一段所說的對計算和存儲資源的浪費, 從而增加了系統的并行效率。
[0006] 同時,目前主流的主機往往配備有CPU和GPU。傳統的并行模型往往會利用主機中 最適合的處理器(CPU或GPU)來計算某個指定問題,而其他設備則閑置了,這是對計算資源 的浪費。而針對固定網格算法來處理固定半徑內的鄰居問題,特別是在GPGPU的出現開始, 往往只交給GPU來處理。盡管CPU在處理這個問題方面性能不及GPU,但是合理利用CPU的計 算資源來協助GHJ還是一項非常有意義的工作。 發明內容
[0007] 本發明的目的是提供一種在CPU-GPU異構框架下遍歷固定半徑內鄰居的自適應并 行算法,該算法在于充分利用主流單節點主機的所有計算能力,來更快速地用基于固定網 格算法來處理FNN問題。
[0008] 本發明的目的是這樣實現的:
[0009] 一種在CPU-GPU異構框架下遍歷固定半徑內鄰居的自適應并行算法,它包括以下 步驟:a)基于固定網格法將空間劃分為互不相交的單元格,通過遍歷鄰接單元格中的點來 尋找所有在固定范圍內的其他點;
[0010] b)GPU自適應并行模型
[0011] i)大量GPU內核程序的組織與調度
[0012] 1)從CPU上發射GPU父內核程序,該內核程序中每一個線程負責空間中一個單元格 的計算;
[0013] 2)每個父內核程序線程計算其所負責的單元格內的點的數量、點在內存中的存儲 范圍、計算這些點所需要的線程及內存資源;
[0014] 3)每個父內核程序線程根據所需要的線程以及內存資源,使用GPU動態并行快速 地為其所負責的單兀格發射一個GPU子內核程序來負責該單兀格中點的計算;子內核程序 中的線程數量依賴于單元格中點的數量;
[0015] ii)GPU內存訪問優化
[0016 ] 1)為每個子內核程序中的線程塊在共享內存中開辟足夠存放W個點的必要數據的 空間;其中,W是sn?硬件能夠同時執行的指令數量;在時下主流的GPU中這個值為32;
[0017] 2)每個子內核程序中的線程塊中的前W個線程讀取W個鄰居點的數據到共享內存 中;通過GPU全局內存的合并訪問從而在一次全局內存訪問中讀取多個點的數據;
[0018] 3)每個子內核程序中的線程讀取在共享內存中的W個鄰居信息并做相應的處理;
[0019] 4)重復本步驟2)和3)直到對于該子內核程序所負責的單元格的所有鄰接點的數 據都被訪問過;
[0020] c)CPU-GPU協同計算模型:
[0021 ]根據GPU自適應并行模型的缺陷,讓CPU協同計算 [0022] i) CPU-GPU數據傳輸優化
[0023] CPU和GPU使用不同的存儲空間,當需要進行數據同步時,兩者進行頻繁的數據交 換,優化步驟具體包括:
[0024] 1)任務分配策略:將包含點少的單元格交給CPU處理,其余的給GPU處理;
[0025] 2)將計算工作進行分組:將整個計算區域分成幾個子區域,點根據其在空間中的 位置信息來確定其所在的子區域;計算將以子區域為單位計算,為了區域間的負載均衡,每 個子區域所包含的點的個數是相近的;
[0026] 3)重疊計算與數據傳輸:以本步驟2)中所分的子區域為單位進行計算;當一個子 區域中的點計算完畢后,馬上將結果傳到對端即CPU計算完畢后將結果傳到GPU的存儲空間 中,反之亦然;
[0027] 4)新的數據組織方式:將給CPU和GPU處理的點的數據集中在一起,得以較小的成 本調度大量的數據,并減少大量的冗余計算;
[0028] 5)根據上述要求,建立一套新的空間中點的排序規則,將點的數據在計算之前進 行排序,能夠高效訪問和快速定位;使用以上信息構成一個用于對點的數據進行排序的哈 希值,并根據該值使用基數排序或者計數排序對點的數據進行排序;
[0029] ii)負載均衡策略
[0030]使用動態負載均衡策略,以保證CPU和GPU能根據自己的計算能力的特性,分配到 適合的工作以及合理的工作量;
[0031] 1)-組指代單元格中點的數量的閥值來決定某個點是由CPU還是GPU來計算;為每 一個計算工作分組設定一個閥值;
[0032] 2)如果CPU和GPU的運算時間之比在[α,β] (〇〈α〈β〈1)范圍之內,則不調整兩者的工 作量;
[0033] 3)如果GPU的耗時較低,則直接調整一組閥值中的其中一個來增加 GPU的工作量; [0034] 4)如果CPU耗時較低,將使用如下方法增加 CPU的工作量:
[0035] a)預測更改了閥值之后的CPU計算量Wf = w〇+WA,其中Wf為預測工作量,w。為原有工 作量,w△為工作增加量;
[0036] b)預測計算時間q =4# f,其中,tcpu為上一次計算CPU的耗時,%為預測耗時;
[0037] c)判斷% <U?X及,其中,tgpu為上一次計算GPU的耗時,如果是真,則修改閥值以 增加 CPU的計算量。
[0038]本發明的有益效果:
[0039] 本發明被運用于SPH方法模擬流體,并以此來檢測其性能,SPH方法中有密度計算 和力計算兩個部分涉及到FNN問題。GPGPU平臺使用的是CUDA,并且使用自己開發的CPU-GPU 異構框架,CPU方面的多線程框架是基于生產者消費者模型開發,這個模型被廣泛運用于處 理大規模并發事務的多線程服務器中。
【附圖說明】
[0040] 圖1為傳統并行模式中GPU全局內存的串行訪問過程圖;
[0041 ]圖2為只適用GPU動態并行而沒有CPU協同計算的范例圖;