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