近幾年眾核硬體逐漸被應用到資料倉儲產品當中。目前主要的眾核硬體包括以Intel SCC為代表的眾核CPU、以Intel志強融核系列為代表的眾核副處理器、以NVIDIA和AMD為代表的眾核GPU。本文第一章介紹目前的主要的眾核硬體及其特性,並從性價比和通用性方面對眾核硬體進行比較;第二章介紹目前資料倉儲中典型操作符在眾核硬體上的最佳化技術。
1. 主要眾核硬體
1.1. 多核CPU多核的CPU雖然不是嚴格意義上的眾核,但是在目前的很多研究中都將多核CPU視為和眾核具相似的硬體而進行比較研究。多核CPU目前通常認為是8核及以下的通用CPU,每個核都有獨立的L2和L1 Cache,多個核之間需要通過共用的記憶體或者L3 Cache才能交換資料。但核心數量並不是多核與眾核的嚴格分界線,Intel目前核心數最多CPU可以達到10個核。多核與眾核的主要區別在於通用性和體繫結構方面。
1.2. 眾核CPU眾核的CPU目前並不常見,在市場上沒有銷售。以Intel SCC為代表的眾核CPU只提供給合作的高校和科研院所作為研究用途。在近幾年的論文中常可以看見SCC的身影。
Intel SCC中整合了48個對等的核,即每個核的功能和效能都是一樣的,且每個核都有專屬的L2 Cache。每兩個核整合在一個tile中,共24個tile組成一個4*6的矩陣,之間通過CPU內部的告訴匯流排串連。每個tile中的兩個核共用一部分(16KB)L1 Cache,這部分共用的L1 Cache成為MPB(Massage Passing Buffer)。所有tile中的MPB又可以被任意一個核訪問,從而構成了一個384KB L1 Cache。
SCC中的每個核具有1GHz的主頻和較強的邏輯計算能力,支援的指令集和普通的CPU類似。從而在增加核心數的同時保證了通用性。此外,特殊的Cache設計使得可以針對具體的計算任務做出最佳化。
1.3. 眾核副處理器副處理器通過高速匯流排和CPU串連或者PCI-E借口串連到北橋上,是輔助CPU完成特定計算任務的計算機件。ARM架構的微處理器可以支援多大數十個副處理器,在嵌入式終端和智慧型裝置中應用非常廣泛。在通用計算平台上,Intel也推出了志強融核系列的協處理產品。
至強融核副處理器其實是一款搭載眾核處理器、顯存(GDDR5)、PCI-E16X介面的外設,通過PCI-E插槽接入主板,通過北橋和CPU、主存串連。
目前的志強融合副處理器最多繼承61個核,其中一個核是處理PCI-E資料轉送的,其他60個核是對等的計算單元。支援的板載記憶體的類型為DDR5,具有300+GB/s的訪存頻寬,最大可以支援16GB的板載記憶體。較GPU而言,副處理器支援的板載訪存頻寬相近,但支援的最大記憶體大出1-2倍,同時副處理器的核心數相對較少、但邏輯計算能力更強、通用性更好。
1.4. 眾核GPU眾核GPU是目前最為常見的眾核硬體。主要的GPU廠商NVIDA和AMD都提供了眾核的GPU產品。其中NVIDA實現的CUDA技術應用已經非常廣泛。在架構上GPU和副處理器有相似之處。但眾核GPU中的核心計算能力較強、邏輯能力很差,因此GPU的專用性更強,通用性更差。此外,GPU中的核心通常被分為若干個組,每個組中有幾十個核心,這些核心可以同時執行同一條指令、處理不同的資料,即SIMP。
1.5. 眾核硬體比較在通用性方面
1、多核CPU:通用,直接通過資料匯流排訪問系統記憶體,頻寬20-30GB/s;
2、眾核 CPU:通用性稍差,架構類似GPU和副處理器,但可以直接存取系統主存,目前還沒推廣
3、眾核副處理器:和GPU類似,單核的計算能力和邏輯運算能力更強,通用性更好一些。
4、眾核GPU: 浮點計算能力強,邏輯運算能力差,顯存幾GB,頻寬200GB/s,但需要通過PCI-E匯流排從主存取資料(PCI-E 16x :4GB/s),通用性差
能耗、性價比的比較
GPGPU的性價比最高、能耗最低,但軟體開發成本高,在部分演算法中效能並不突出 Many-core CPU總體好於multi-core CPU Multi-core CPU在某些複雜計算中表現突出。
總結下來,除了通用的多核CPU以外,many-core並不是共用所有的主存和cache的,無論CPU還是GPU都是NUMA(Non Uniform Memory Access Architecture,非統一記憶體訪問架構)的架構。 演算法要訪問資料。要提高並行度,就要提高資料訪問的局部性 GPU和副處理器訪問系統記憶體的頻寬會比訪問本地記憶體地頻寬低50倍以上。
2. 眾核上資料倉儲最佳化技術
2.1. 緩衝的最佳化眾核處理器通常在緩衝方面都有著和通用的多核CPU不同的設計,比如SCC就支援L1 Cache的跨核訪問。在資料倉儲演算法中,表掃面演算法由於資料局部性不好,資料如果經過多級緩衝進入核中處理勢必會影響效率,因此最佳化時可以針對錶掃描演算法,將資料直接載入到MPB中,進而進入核中做謂詞過濾。
2.2. 串連演算法的最佳化資料倉儲中常用的串連演算法包括sort-merge串連和hash串連。
Sort-merge串連由於排序和歸併的過程中,多個線程(核)並不需要共用資料,因此很適合在眾核硬體上實現。但是sort-merge本身有很多的局限性,比如資料倉儲中的串連通常在維表和事實表之間進行,而事實表是非常大的,sort-merge要求事實表實現在串連屬性上排序,排序的代價是非常大的。
更為通用的hash串連由於在hash劃分資料和串連時,多個線程(核)需要訪問共用的雜湊表和雜湊桶,如果不做最佳化,在眾核上是不可能有明顯的效能提升的。因此出現了一些最佳化的技術。
常見的最佳化技術是基於Bucket的,即先將資料劃分為不相關的Bucket再做連結。那麼演算法就分為分桶和串連兩個部分。
在分桶階段,為了利用多核達到效能的提升,也要保證多個核心不能有共用的資料,常用的演算法有兩種:
1、類似quickSort的分桶演算法
Step1: 將array中hash值末位為0和為1的元素分開
Step2: 對分開的兩個子array分別按照hash值末兩位的值分開,依次遞迴,直到子array中元素個數小於某個閾值
2、兩階段分桶演算法
Hash桶的個數是固定的,第一階段,各個core將資料表的一段hash到自己的桶裡。 第二階段,各個core將某一列上的桶合并。2.1所示。
圖2.1. 兩階段分桶演算法
第一種演算法的複雜度較高一些(n*log n),後一種演算法雖然是線性時間複雜度,但是要求分桶的個數預先固定,在資料扭曲的情況下就會導致分桶的不均衡。
分桶之後的串連演算法可以採用基於位元影像的串連演算法。2.2所示,第一階段是分桶,第二階段是在左表的一個分桶上計算出一個位元影像,其實就是一個布隆過濾器,第三階段基於左表的位元影像來過濾右表的分桶,避免了不必要的串連操作,也就避免的大量的記憶體訪問。
圖2.2. 基於分桶的串連演算法
此外,串連演算法的最佳化方面,由於資料倉儲中維表很小,可以在維表上做完謂詞過濾、得到一個布爾向量,將布爾向量讀入到各個核的緩衝區中,和事實表做串連。
還有一種稱為Invisible Join 的串連最佳化技術,是一種查詢重寫技術。由於維表比較小,當維表和事實表串連時,將串連條件轉換成事實表上的謂詞。 如:事實表的一個外鍵串連到維表的一個主鍵上。如果維表的主鍵上的值在一個連續範圍內,可以將其重寫成事實表外鍵上的一個between謂詞,從而避免了反覆對維表的隨機訪問。