Chip ARM Phá Kỷ Lục Tốc Độ cho Thuật Toán Nén Dữ Liệu

Nhóm Cộng đồng BigGo
Chip ARM Phá Kỷ Lục Tốc Độ cho Thuật Toán Nén Dữ Liệu

Trong thế giới của nén dữ liệu, mã hóa delta từ lâu đã là một kỹ thuật trụ cột để thu nhỏ dữ liệu và lưu trữ hiệu quả hơn. Quá trình này chuyển đổi các chuỗi số thành sự khác biệt giữa các giá trị liên tiếp, tạo ra các mẫu có thể nén một cách tuyệt vời. Tuy nhiên, việc đảo ngược quá trình này—tái tạo dữ liệu gốc thông qua thao tác được gọi là tổng tiền tố—theo truyền thống là một nút cổ chai tính toán do sự phụ thuộc nối tiếp vốn có. Nghiên cứu mới tiết lộ cách các kỹ thuật tối ưu hóa sáng tạo trên kiến trúc Neoverse V2 mới nhất của ARM đang phá vỡ các rào cản hiệu suất trước đây cho thao tác cơ bản này.

Nút Cổ Chai Ẩn Trong Giải Nén Dữ Liệu

Trong khi bản thân mã hóa delta chạy hiệu quả ở 41 GB/s trên phần cứng hiện đại, thì thao tác đảo ngược vẫn cứng đầu chậm hơn nhiều. Vấn đề nằm ở bản chất toán học của tổng tiền tố: mỗi giá trị đầu ra phụ thuộc vào tất cả các phép tính trước đó. Điều này tạo ra cái mà các kiến trúc sư máy tính gọi là chuỗi phụ thuộc, nơi các bộ xử lý phải chờ mỗi thao tác hoàn thành trước khi bắt đầu thao tác tiếp theo. Các phương pháp tiếp cận truyền thống như thuật toán FastPFoR nổi tiếng thực tế lại hoạt động kém hơn một triển khai đơn giản trên bộ xử lý Graviton4 của ARM, chỉ đạt 7.7 GB/s so với 10.8 GB/s của phương pháp ngây thơ.

Tôi đã nghĩ con số đầu tiên là lỗi đánh máy nhưng nó lại chính xác; cách tiếp cận ngây thơ lại nhanh hơn một phương pháp 'tốt hơn'. Một minh chứng nữa cho thấy việc thực sự đánh giá điểm chuẩn trên nền tảng mục tiêu quan trọng thế nào!

Kết quả đáng ngạc nhiên này làm nổi bật cách hiệu suất thuật toán có thể thay đổi đáng kể trên các kiến trúc bộ xử lý khác nhau, nhấn mạnh tầm quan trọng của việc tối ưu hóa cụ thể cho nền tảng thay vì dựa vào các phương pháp đã được thiết lập có thể được thiết kế cho phần cứng khác.

Phá Vỡ Chuỗi Phụ Thuộc

Đột phá đến từ việc cấu trúc lại phép tính để giảm thiểu các sự phụ thuộc nối tiếp này. Thay vì áp dụng ngay tổng tích lũy cho mỗi giá trị mới, cách tiếp cận mới xử lý dữ liệu theo khối và trì hoãn bước tích lũy. Điều này cho phép phần cứng thực thi không theo thứ tự của bộ xử lý làm việc trên nhiều thao tác đồng thời thay vì chờ đợi từng kết quả. Kỹ thuật này đánh đổi một sự gia tăng nhỏ về tổng số lệnh để đổi lấy khả năng song song được cải thiện đáng kể, đạt 19.8 GB/s—gần gấp đôi hiệu suất của triển khai ngây thơ và nhanh gấp 2.6 lần so với FastPFoR.

Phương pháp này mở rộng ra ngoài tổng tiền tố đơn giản đến các phép biến đổi phức tạp hơn như mã hóa delta-of-delta (hiệu quả cho chuỗi dấu thời gian) và mã hóa XOR với giá trị trước đó (được sử dụng trong các lược đồ nén dấu phẩy động như Gorilla). Đối với việc đảo ngược delta-of-delta, kỹ thuật đường ống đã mang lại tốc độ tăng 2.2 lần, trong khi các thao tác XOR được hưởng lợi từ một cách tiếp cận thay thế dựa trên chuyển vị giúp cải thiện hiệu suất 2.0 lần.

Các Khái Niệm Kỹ Thuật Chính Được Giải Thích

  • Delta Coding: Lưu trữ sự khác biệt giữa các giá trị liên tiếp thay vì các con số thô, tạo ra các mẫu dễ nén hơn
  • Prefix Sum: Phép toán ngược lại để tái tạo các giá trị ban đầu bằng cách tích lũy các giá trị chênh lệch
  • Dependency Chain: Khi mỗi phép tính phụ thuộc vào kết quả trước đó, buộc phải thực thi tuần tự
  • SIMD Intrinsics: Các hàm đặc thù của bộ xử lý hoạt động trên nhiều phần tử dữ liệu cùng lúc
  • Neoverse V2: Kiến trúc CPU cấp máy chủ mới nhất của ARM được sử dụng trong các bộ xử lý AWS Graviton4

Cuộc Tranh Luận CPU vs GPU Trong Khối Lượng Công Việc Thực Tế

Cuộc thảo luận tự nhiên mở rộng sang việc liệu GPU có thể đẩy nhanh hơn nữa các thao tác này hay không. Trong khi GPU xuất sắc trong tính toán song song, thì chi phí chuyển bộ nhớ giữa RAM hệ thống và bộ nhớ GPU thường làm mất đi những lợi thế lý thuyết cho khối lượng công việc nén trong thế giới thực. Như một bình luận viên đã lưu ý, Nếu dữ liệu đã có trong bộ nhớ GPU, thì có. Nếu không, bạn sẽ bị giới hạn bởi nút cổ chai bộ nhớ DRAM←→VRAM.

Phân tích hiệu suất chi phí tiết lộ những sự đánh đổi thú vị. So sánh giá các phiên bản đám mây, một phiên bản dựa trên ARM m8g.8xlarge với 32 lõi cung cấp băng thông bộ nhớ 175 GB/s với giá 1.44 đô la Mỹ mỗi giờ, trong khi các phiên bản GPU với băng thông lý thuyết tương tự có giá cao hơn. Đối với các cơ sở dữ liệu chuỗi thời gian và khối lượng công việc phân tích điển hình, nơi dữ liệu trải qua nhiều lần biến đổi trong khi được lưu trong bộ nhớ đệm của CPU, cách tiếp cận ARM thể hiện hiệu quả hấp dẫn.

So sánh Hiệu năng trên AWS Graviton4 (Neoverse V2)

Thao tác Cách triển khai Thông lượng (GB/s) Tăng tốc so với 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

Điều kiện thử nghiệm: bộ dữ liệu làm việc 4 KiB, 20.000 lần lặp, đơn luồng, L1 cache nóng

Vượt Ra Ngoài Hiệu Suất Lý Thuyết

Cuộc thảo luận trong cộng đồng đã tiết lộ những cân nhắc thực tế vượt ra ngoài các con số thông lượng thô. Một số bình luận viên chỉ ra rằng việc chèn các giá trị tuyệt đối ở các khoảng thời gian đều đặn trong các luồng được mã hóa delta có thể cho phép song song hóa hoàn hảo, mặc dù điều này sẽ ảnh hưởng đến hiệu quả nén. Những người khác chia sẻ kinh nghiệm từ việc triển khai các thuật toán tương tự trong các hệ thống sản xuất, lưu ý rằng cách tiếp cận tối ưu phụ thuộc nhiều vào kiểu truy cập dữ liệu và tần suất cập nhật.

Các kỹ thuật được mô tả không giới hạn ở số nguyên 32-bit—chúng mở rộng một cách tự nhiên sang các kiểu dữ liệu 8, 16 và 64-bit, làm cho chúng có thể áp dụng cho nhiều kịch bản nén dữ liệu khác nhau, từ hệ thống cơ sở dữ liệu đến tính toán khoa học. Triển khai tham chiếu sử dụng các hàm nội tại SIMD, về cơ bản là các lệnh hợp ngữ được bọc trong các hàm C, cho phép kiểm soát chi tiết các khả năng của bộ xử lý.

Khi khối lượng dữ liệu tiếp tục phát triển theo cấp số nhân, các tối ưu hóa như thế này chứng minh rằng vẫn còn hiệu suất đáng kể có thể được mở khóa trong các thuật toán cơ bản thông qua lập trình nhận thức kiến trúc. Kết quả cho thấy đôi khi các tối ưu hóa hiệu quả nhất không đến từ việc ném thêm phần cứng vào một vấn đề, mà là làm việc thông minh hơn với phần cứng chúng ta đã có.

Tham khảo: NEON Delta Coding