從SIMD與AVX-512說(shuō)起,你明白了嗎?
昨天提到了PG 16開(kāi)始支持SIMD了,并且我也說(shuō)了很多數(shù)據(jù)庫(kù)早就開(kāi)始使用SIMD來(lái)充分利用CPU廠商提供的擴(kuò)展指令集,特別是INTEL的AVX-512。很多DBA可能不太關(guān)注硬件,因?yàn)閿?shù)據(jù)庫(kù)雖然依賴(lài)于某些硬件平臺(tái),但是可以 相對(duì)獨(dú)立的運(yùn)行,在大多數(shù)情況下,DBA不太需要去關(guān)注硬件的細(xì)節(jié)。不過(guò)隨著現(xiàn)代硬件的不斷發(fā)展,數(shù)據(jù)庫(kù)與硬件的結(jié)合越來(lái)越緊密,數(shù)據(jù)庫(kù)產(chǎn)品也會(huì)充分的利用現(xiàn)代硬件的特性來(lái)加速某些任務(wù)。比如說(shuō)通過(guò)對(duì)SIMD的支持來(lái)加速運(yùn)算速度,從而提高行列轉(zhuǎn)換,數(shù)據(jù)壓縮,加解密等方面的性能。甚至有些數(shù)據(jù)庫(kù)產(chǎn)品已經(jīng)開(kāi)始支持使用GPU的算力來(lái)進(jìn)一步提高這些任務(wù)的性能。
AVX-512是Intel在2013年提出的一組512位擴(kuò)展指令集,用于x86指令集架構(gòu)(ISA)的高級(jí)向量擴(kuò)展(Advanced Vector Extensions,SIMD)指令。它可以加速諸如科學(xué)模擬、金融分析、人工智能/深度學(xué)習(xí)、3D建模和分析、圖像和音頻/視頻處理、加密和數(shù)據(jù)壓縮等工作負(fù)載和用例的性能。通過(guò)SIMD,數(shù)據(jù)庫(kù)產(chǎn)品可以調(diào)用AVX-512、SSE等擴(kuò)展指令集的功能,同樣也可以使用ARM芯片上的ASIMD、SVE2等指令集來(lái)達(dá)到類(lèi)似的效果。
近些年GPU火起來(lái)了,在科學(xué)計(jì)算上GPU有著CPU無(wú)法比擬的性能。GPU通常擁有更多的計(jì)算單元和更高的內(nèi)存帶寬,因此在處理大規(guī)模的數(shù)據(jù)并行計(jì)算時(shí),GPU的性能優(yōu)勢(shì)很明顯。例如,在深度學(xué)習(xí)領(lǐng)域,GPU可以比CPU快幾十倍甚至上百倍。SIMD的主要目的是利用一個(gè)指令同時(shí)對(duì)多個(gè)數(shù)據(jù)進(jìn)行相同的操作,從而實(shí)現(xiàn)空間上的并行性和提高程序的運(yùn)算速度。SIMD可以利用一組指令對(duì)多組數(shù)據(jù)通進(jìn)行并行操作,如加法、乘法、比較等。SIMD可以應(yīng)用于圖像/音視頻處理、數(shù)據(jù)分析、科學(xué)計(jì)算、數(shù)據(jù)加密和壓縮和深度學(xué)習(xí)等大規(guī)模運(yùn)算需求的應(yīng)用場(chǎng)景。通過(guò)SIMD,可以讓CPU在這方面的劣勢(shì)得到一定程度的彌補(bǔ)。在使用AVX512指令集進(jìn)行浮點(diǎn)數(shù)加法運(yùn)算時(shí),可以一次對(duì)8個(gè)雙精度浮點(diǎn)數(shù)或16個(gè)單精度浮點(diǎn)數(shù)進(jìn)行操作,相比于標(biāo)量運(yùn)算,可以提高8倍或16倍的性能。
雖然沒(méi)有做過(guò)多的宣傳,不過(guò)Oracle數(shù)據(jù)庫(kù)很早就開(kāi)始使用SIMD指令集做一些計(jì)算任務(wù)。在內(nèi)存列存儲(chǔ)中,使用SIMD指令集對(duì)數(shù)據(jù)進(jìn)行壓縮、解壓縮、掃描、過(guò)濾、聚合等操作;在哈希連接中,使用SIMD指令集對(duì)數(shù)據(jù)進(jìn)行哈希、構(gòu)建、探測(cè)、收集等操作;在向量化表達(dá)式計(jì)算中,使用SIMD指令集對(duì)數(shù)據(jù)進(jìn)行算術(shù)、邏輯、比較等操作。這些操作都可以提高Oracle數(shù)據(jù)庫(kù)的性能和效率。
在其他數(shù)據(jù)庫(kù)中,也有很多使用了SIMD來(lái)提高計(jì)算類(lèi)任務(wù)的性能。比如TiDB也是比較早使用SIMD的數(shù)據(jù)庫(kù)產(chǎn)品。最典型的是在TiFlash上,在表達(dá)式計(jì)算中,使用了SIMD指令集來(lái)加速向量化計(jì)算,提高了表達(dá)式的執(zhí)行效率;在編碼和解碼中,使用了SIMD指令集來(lái)加速數(shù)據(jù)的壓縮和解壓縮,減少了數(shù)據(jù)傳輸和存儲(chǔ)的開(kāi)銷(xiāo);在哈希函數(shù)中,使用了SIMD指令集來(lái)加速哈希值的計(jì)算,提高了哈希表的性能;在排序算法中,使用了SIMD指令集來(lái)加速數(shù)據(jù)的比較和交換,提高了排序的效率。
Oceanbase也比較重視將向量化引擎引入數(shù)據(jù)庫(kù),利用SIMD來(lái)提升一些復(fù)雜分析類(lèi)任務(wù)的性能。提高數(shù)據(jù)庫(kù)單核計(jì)算性能,降低查詢(xún)響應(yīng)時(shí)間數(shù)據(jù)庫(kù)來(lái)說(shuō)至關(guān)重要。為幫助客戶(hù)解決 HTAP 混合負(fù)載下數(shù)據(jù)查詢(xún)效率難的問(wèn)題,OceanBase 引入向量化技術(shù)設(shè)計(jì)了向量化查詢(xún)引擎,實(shí)現(xiàn)了 HTAP 場(chǎng)景下復(fù)雜分析查詢(xún)性能的大幅提升。在 TPC-H 30TB 測(cè)試場(chǎng)景下,OceanBase 向量化引擎的性能是非向量化的 3 倍。對(duì)于 Q1 這種聚合分析且計(jì)算密集的 SQL 查詢(xún),性能提升約 10 倍。測(cè)試結(jié)果可以證明,向量化引擎對(duì)提升 SQL 執(zhí)行效率、降低用戶(hù)的查詢(xún)響應(yīng)時(shí)間具有相當(dāng)明顯的效果。
上面這張圖來(lái)自于Oceanbase官方,并非我們自己的測(cè)試結(jié)果,從中可以看出向量化引擎的效果還是相當(dāng)好的。目前引入向量化計(jì)算,更好的利用現(xiàn)代CPU的能力已經(jīng)是廣大數(shù)據(jù)庫(kù)廠商的共識(shí)。對(duì)于數(shù)據(jù)庫(kù)廠商和用戶(hù)來(lái)說(shuō),這都是一件好事情,不過(guò)對(duì)于廣大DBA來(lái)說(shuō),不能算是好事情。因?yàn)橐粋€(gè)數(shù)據(jù)庫(kù)產(chǎn)品,在CPU類(lèi)型不同的服務(wù)器上,甚至在相同架構(gòu),但是存在代差的服務(wù)器上,可能跑出來(lái)的性能會(huì)差異較大,這會(huì)讓人十分蒙圈。這年頭,干DBA也真是一件十分苦逼的事情。