使用多核 CPU 趨近實(shí)時(shí) C-arm 重建
圖 1.(左)C-arm CT 系統(tǒng)的介入應(yīng)用(圖片由西門(mén)子公司提供)。(右)通過(guò) RabbitCT 數(shù)據(jù)集重建的三維體獲得的軸向切面圖。
Hannes G.Hofmann,德國(guó)埃爾朗根大學(xué)模式識(shí)別實(shí)驗(yàn)室。
Hannes 是埃爾朗根大學(xué)的博士研究生,從事加速圖像重建技術(shù)的研究。他的研究方向包括醫(yī)學(xué)圖像處理、并行架構(gòu)的高性能計(jì)算和性能指標(biāo)評(píng)測(cè),目前主要關(guān)注使用多核服務(wù)器的 C-arm CT 圖像實(shí)時(shí)重建。
Hannes 已取得了埃爾朗根大學(xué)計(jì)算機(jī)科學(xué)專(zhuān)業(yè)的理學(xué)碩士學(xué)位。
摘要:
三維(3-D)計(jì)算斷層掃描(CT)成像技術(shù)有助于醫(yī)療人員更加精確地診斷疾病,改進(jìn)治療計(jì)劃及導(dǎo)航,展開(kāi)深入的后續(xù)研究。C-arm CT 系統(tǒng)(如圖 1(左) 所示)可從患者的不同角度捕獲大量二維平面投影。目前,臨床上最常用的三維數(shù)據(jù)重建算法是濾波反投影法(filtered backprojection)。簡(jiǎn)單地說(shuō),就是將所有投影值抹入三維體中。重建屬于計(jì)算密集型任務(wù),而且由于使用的數(shù)據(jù)集龐大,因而需要高內(nèi)存帶寬。使用 C-arm 系統(tǒng),3-D 數(shù)據(jù)也可在介入期間獲得,從而支持新的醫(yī)學(xué)應(yīng)用。不過(guò),OR 環(huán)境需要多至 60 fps 的實(shí)時(shí)處理,包括 2-D 預(yù)處理、3-D 重建和 3-D 后處理。在研究中,我們對(duì) GPU 及多核處理器在動(dòng)態(tài)執(zhí)行 C-arm CT 數(shù)據(jù)重建方面的適用性進(jìn)行了探索。
所使用技術(shù)說(shuō)明:
我們基于 Feldkamp [1] 的 CT 重建針對(duì)多線程、向量化處理和高速緩存利用進(jìn)行了優(yōu)化。算法 1 顯示了對(duì)全部 496 投影圖像執(zhí)行的基本算法。三維體大小為 512^3 體素。為獲得可比較的結(jié)果,同時(shí)做正確性評(píng)估,我們使用了 RabbitCT [2] 基準(zhǔn)測(cè)試。優(yōu)化后的實(shí)施分別在兩臺(tái)英特爾至強(qiáng)多核服務(wù)器(8 核和 24 核)上進(jìn)行測(cè)試。
24 核服務(wù)器配備了四枚六核 Hexacore CPU(至強(qiáng) 7460)和 32GB DDR2 RAM,
另一個(gè)系統(tǒng)采用兩枚 四核Quadcore CPU(至強(qiáng) 5550),并配有集成內(nèi)存控制器和 12GB DDR3 RAM。
兩個(gè)系統(tǒng)均在 2.66 GHz 下運(yùn)行且均使用 Linux。此報(bào)告使用的服務(wù)器為預(yù)生產(chǎn)系統(tǒng)。正式生產(chǎn)的硬件有望達(dá)到相似的性能級(jí)別。
算法 1.投影圖像反投影的基本步驟。x、y、z 代表離散體坐標(biāo),u、v 為連續(xù)投影坐標(biāo)。
多線程。我們對(duì)兩種多線程方法進(jìn)行了研究,OpenMP 和英特爾線程構(gòu)件模塊 (TBB)。并行化通過(guò)將三維體劃分為 NP 個(gè)塊(NP 代表可用內(nèi)核的數(shù)量)而引入。這樣,所有塊都可以獨(dú)立進(jìn)行處理。兩次實(shí)施都沒(méi)在該步驟使用 CPU 的矢量處理 (SSE) 單元。它們?cè)诓捎貌煌幾g器(GNU gcc 和英特爾 C 編譯器)的兩臺(tái)服務(wù)器上進(jìn)行了測(cè)試。
圖 2 顯示了對(duì)比標(biāo)量單線程實(shí)施的速度提升情況。結(jié)果,使用 gcc 的情況下,TBB 比 OpenMP 快 10-20%。英特爾 C 編譯器的 OpenMP 實(shí)施與 TBB 速度相當(dāng)。注意,感謝超線程技術(shù),8 核服務(wù)器上可能實(shí)現(xiàn)超線性加速(多至 11.28 倍)。
向量化。在第二步中,使用了 CPU 的向量處理單元。這些單元同時(shí)對(duì)多個(gè)數(shù)據(jù)元素執(zhí)行了相同的指令(如乘法)(簡(jiǎn)稱(chēng) SIMD)?,F(xiàn)在的 CPU 一次可處理 4 個(gè)單精度數(shù)字。
算法 1 的最內(nèi)部循環(huán)體(對(duì)一列內(nèi)的每個(gè)體素(有著固定的 y 和 z 坐標(biāo))執(zhí)行同樣的計(jì)算)被手動(dòng)向量化。。對(duì)于大多數(shù)情況來(lái)說(shuō),此操作很簡(jiǎn)單。
不過(guò),對(duì)于條件代碼部分,向量化則頗為復(fù)雜,這是因?yàn)橐粋€(gè)矢量的單個(gè)元素不確定是否有分支。如果當(dāng)前體素位于當(dāng)前投影的視場(chǎng) (FOV) 內(nèi),則反投影將包含一個(gè)校檢以避免無(wú)效的內(nèi)存訪問(wèn)。無(wú)效坐標(biāo)及對(duì)應(yīng)的體素使用掩碼被排除在下一步處理之外。
另一個(gè)問(wèn)題是由幾何體引發(fā)的。鄰近的體素沒(méi)有必要投射到投影圖像的相鄰體素中。這在加載體素矢量的投影值時(shí)將導(dǎo)致非線性?xún)?nèi)存訪問(wèn)。因此,所有體素將不得不以標(biāo)量方式獲取,然后被插入到隨后用來(lái)計(jì)算雙線性插值的 SIMD 矢量中。
圖 3. 兩個(gè) Linux 系統(tǒng)在向量化、多線程和高速緩存優(yōu)化后與使用英特爾編譯器的單線程實(shí)施的速度提升對(duì)比。
圖 3 的第一列顯示 SIMD 優(yōu)化的速度提升。在兩個(gè)系統(tǒng)中,單線程向量化代碼的速度均比標(biāo)量代碼快約 2.9 倍。由于上述問(wèn)題,速度無(wú)法實(shí)現(xiàn)理論上最大的 4 倍提升。將多線程與向量化結(jié)合(列 2 和列 3),8 核和 24 核服務(wù)器分別實(shí)現(xiàn)了 29.5 倍和 43.5 倍的加速。如果只將這些數(shù)字與多線程進(jìn)行比較,向量化取得的效果分別減少到 2.6 倍和 1.9 倍。這表明,在使用所有處理單元時(shí),24 核服務(wù)器的內(nèi)存帶寬成為問(wèn)題瓶頸。
高速緩存優(yōu)化。高速緩存優(yōu)化的思路是將數(shù)據(jù)保留在計(jì)算內(nèi)核中,在對(duì)其進(jìn)行多次運(yùn)算后再存回主內(nèi)存。對(duì)每個(gè)投影圖像直接執(zhí)行算法 1 將導(dǎo)致每次都需要讀取和寫(xiě)入整個(gè)三維體。在 512^3 體素情形中,每個(gè)投影圖像將生成 1GB 的數(shù)據(jù)傳輸。
為減少數(shù)據(jù)傳輸量,僅將少量體素加載到高速緩存,并從幾個(gè)投影圖像獲得更新,然后再存回去。這樣,數(shù)據(jù)傳輸可以整體減少到 1GB(僅體數(shù)據(jù)),大大減少了對(duì)內(nèi)存帶寬的需求。
圖 3 的右列顯示,高速緩存優(yōu)化僅為 8 核服務(wù)器帶來(lái)了微弱優(yōu)勢(shì) (5%),此處少數(shù)處理器共享著充足的主內(nèi)存帶寬。另一方面,24 核服務(wù)器卻從中明顯受益,因?yàn)閮?nèi)存帶寬是它的限制因素。
結(jié)論
我們證實(shí)了選擇不同庫(kù)和編譯器對(duì)代碼性能有著顯著的影響。英特爾的 C 編譯器和 OpenMP 實(shí)施比 GNU gcc 的速度提升了 20%。
本文中討論的重建問(wèn)題可以通過(guò)增加內(nèi)核得到很好地解決。但是,基于酷睿2的服務(wù)器卻由于內(nèi)存帶寬限制而無(wú)法充分利用其 24 個(gè)CPU。優(yōu)化高速緩存緩解了這一限制,使速度比單線程標(biāo)量實(shí)施提升多至 58.57 倍。
此外,在英特爾多核測(cè)試實(shí)驗(yàn)室 (Many Core Testing Lab) (http://software.intel.com/en-us/articles/intel-many-core-testing-lab/
) 進(jìn)行的實(shí)驗(yàn)表明,帶有 32 個(gè)內(nèi)核的基于 Nehalem 的服務(wù)器速度提升明顯。本研究的更多詳情將在 [3, 4] 給出。