ARM 晶片突破數據壓縮演算法的速度紀錄

BigGo 社群部
ARM 晶片突破數據壓縮演算法的速度紀錄

在數據壓縮領域中,差值編碼(delta coding)長久以來是讓數據變得更小、儲存更有效率的關鍵技術。這項程序能將數字序列轉換為連續值之間的差異,從而形成易於壓縮的規律模式。然而,反轉這個過程——透過所謂的前綴和(prefix sum)運算來重建原始數據——由於其固有的序列依賴性,傳統上一直是運算效能瓶頸。最新研究揭示了在 ARM 最新的 Neoverse V2 架構上,透過創新的優化技術,如何徹底打破這項基礎運算的既有效能障礙。

數據解壓縮中的隱藏瓶頸

雖然差值編碼本身在現代硬體上能以 41 GB/s 的速度高效運行,但其反向運算的速度卻一直遠遜於此。問題在於前綴和的數學特性:每個輸出值都依賴於所有先前的計算結果。這造成了電腦架構師所稱的「依賴鏈」,使得處理器必須等待每個運算完成後才能開始下一個。在 ARM 的 Graviton4 處理器上,傳統方法如知名的 FastPFoR 演算法,其表現實際上比簡單的純量實作還要差,僅達到 7.7 GB/s,而原始方法的效能為 10.8 GB/s。

「我起初以為第一個數字是打錯了,但它是正確的;原始方法竟然比『更好』的方法還要快。這再次證明了在目標平台上進行實際效能測試是多麼重要!」

這個令人驚訝的結果,凸顯了演算法效能如何在不同的處理器架構間產生巨大差異,強調了針對特定平台進行優化的重要性,而非依賴那些可能為不同硬體設計的既定方法。

打破依賴鏈

突破的關鍵在於重新建構計算方式,以最小化這些序列依賴。新的方法並非立即將累計總和應用到每個新數值上,而是以區塊為單位處理數據,並推遲累加步驟。這使得處理器的亂序執行硬體能夠同時處理多個運算,而無需等待每個結果。此技術以略微增加總指令數為代價,換取了平行處理能力的大幅提升,達到了 19.8 GB/s 的效能——幾乎是原始實作的兩倍,比 FastPFoR 快 2.6 倍。

此方法不僅適用於簡單的前綴和,還能延伸至更複雜的轉換,例如雙重差值編碼(對時間戳序列特別有效)以及與前值進行 XOR 的編碼(用於 Gorilla 等浮點數壓縮方案)。對於反轉雙重差值,管線化技術帶來了 2.2 倍的加速;而 XOR 運算則受益於另一種基於轉置的方法,使效能提升了 2.0 倍。

關鍵技術概念說明

  • Delta 編碼:儲存連續數值之間的差異而非原始數字,創造出更易壓縮的模式
  • 前綴和:透過累積差異來重建原始數值的反向操作
  • 依賴鏈:當每個計算都依賴於前一個結果時,強制執行順序處理
  • SIMD 指令集:在多個資料元素上同時運作的處理器專用函數
  • Neoverse V2:ARM 最新的伺服器級 CPU 架構,用於 AWS Graviton4 處理器

真實工作負載下的 CPU 與 GPU 之爭

討論很自然地延伸到 GPU 是否能進一步加速這些運算。雖然 GPU 擅長平行計算,但在真實世界的壓縮工作負載中,系統記憶體與 GPU 記憶體之間的資料傳輸開銷,往往抵消了理論上的優勢。正如一位評論者指出:「如果資料已經在 GPU 記憶體中,那沒問題。否則,您將會受到 DRAM←→VRAM 記憶體瓶頸的限制。」

成本效益分析揭示了有趣的權衡。比較雲端實例價格,一個基於 ARM 的 m8g.8xlarge 實例擁有 32 個核心,提供 175 GB/s 的記憶體頻寬,每小時費用為 1.44 美元;而具有類似理論頻寬的 GPU 實例成本則更高。對於典型的時間序列資料庫和分析工作負載,這些數據在快取於 CPU 記憶體的同時會經歷多次轉換,在此情況下,ARM 的方法展現了引人注目的效率。

在 AWS Graviton4 (Neoverse V2) 上的效能比較

操作 實作方式 吞吐量 (GB/s) 相較於 Naive 的加速比
Delta Coding Naive 41.07 1.0x
Prefix Sum Naive 10.80 1.0x
Prefix Sum FastPFoR 7.70 0.7x
Prefix Sum Pipelined 19.76 1.8x
Delta-of-Delta Reverse Naive 3.63 1.0x
Delta-of-Delta Reverse Pipelined 8.20 2.2x
XOR Reverse Transpose-based 21.53 2.0x

測試條件:4 KiB 工作集、20,000 次迭代、單執行緒、L1 快取熱啟動

超越理論效能

社群討論揭示了超越原始吞吐量數據的實務考量。幾位評論者指出,在差值編碼的資料流中定期插入絕對值,可以實現完美的平行化,儘管這會犧牲壓縮效率。其他人則分享了在生產系統中實作類似演算法的經驗,並指出最佳方法在很大程度上取決於資料存取模式和更新頻率。

文中描述的技術不限於 32 位元整數——它們能自然地延伸至 8、16 和 64 位元資料型態,使其適用於從資料庫系統到科學計算等多種數據壓縮情境。參考實作使用了 SIMD 內建函數,這些本質上是包裝在 C 函數中的組合語言指令,允許對處理器功能進行細粒度控制。

隨著數據量持續呈指數級成長,像這樣的優化技術證明了,透過對架構有深刻理解的程式設計,我們仍然能在基礎演算法中釋放出顯著的效能。結果顯示,有時最有效的優化並非來自於投入更多硬體資源,而在於更聰明地運用我們現有的硬體。

參考資料:NEON Delta Coding