Một thư viện tối ưu hóa ARM NEON mới có tên NEON Bytepack đã chứng minh được những cải thiện hiệu suất ấn tượng trong các tác vụ nén dữ liệu, đạt tốc độ thông lượng lên tới 86 GB/s trên dữ liệu thường trú L1. Bản nghiên cứu trước, được tạo ra bởi nhà phát triển Ashton Six , tập trung vào việc đóng gói và giải nén bit từ các mảng byte một cách hiệu quả bằng cách sử dụng bộ lệnh ARM NEON SIMD .
Xác thực từ cộng đồng thông qua kiểm tra độc lập
Dự án đã có được độ tin cậy khi các thành viên cộng đồng thành công trong việc tái tạo kết quả benchmark trên các nền tảng ARM khác nhau. Một người dùng ban đầu đã đặt câu hỏi về tính xác thực của kết quả, lưu ý về các vấn đề biên dịch với mã so sánh cơ sở. Tuy nhiên, sau khi phát hiện ra rằng triển khai cơ sở x86 sử dụng header SIMDe ( SIMD Everywhere ) để dịch các intrinsic x86 sang tương đương ARM , họ đã xác nhận tính hợp pháp của benchmark.
Kiểm tra trên các instance C4A Axion của Google Cloud cho thấy hiệu suất thậm chí còn tốt hơn so với kết quả Graviton4 ban đầu, với một số cấu hình đạt hơn 123 GB/s cho các thao tác bit-width cụ thể. Việc xác thực này trên nhiều nền tảng máy chủ ARM chứng minh giá trị thực tế của các kỹ thuật tối ưu hóa.
SIMD (Single Instruction, Multiple Data) cho phép bộ xử lý thực hiện cùng một thao tác trên nhiều điểm dữ liệu đồng thời, tăng tốc đáng kể cho một số tác vụ tính toán nhất định.
Kết Quả Kiểm Thử Nền Tảng
- Graviton4 (Neoverse V2): Benchmark gốc cho thấy trung bình nhân 86 GB/s
- Google Cloud C4A Axion: Lên đến 123.63 GB/s cho các thao tác đóng gói 2-bit
- Apple M1 Pro: Hiệu năng hạn chế do hỗ trợ kém các thao tác dịch chuyển nhỏ
- Apple M3/M4: Cải thiện hiệu năng dịch chuyển nhỏ so với M1
Tất cả các nền tảng đều sử dụng cùng kiến trúc lõi Neoverse V2 ngoại trừ bộ xử lý Apple
Đổi mới kỹ thuật đằng sau những cải thiện hiệu suất
Thư viện đạt được những cải thiện tốc độ thông qua một số tối ưu hóa chính. Nó hoạt động ở cấp độ byte thay vì làm việc với các kiểu dữ liệu lớn hơn, cho phép xử lý nhiều phần tử logic hơn trên mỗi lệnh. Việc triển khai sử dụng kỹ thuật interleaving được căn chỉnh, nơi các contributor dữ liệu căn chỉnh theo ranh giới từ, cho phép hầu hết các thao tác di chuyển dữ liệu thu gọn thành các thao tác đơn lẻ mà không có spillage cross-word.
Mã cũng sử dụng các kỹ thuật instruction shaping, sử dụng các hàm helper nhỏ cho các thao tác load, store và thao tác bit khuyến khích bộ xử lý sử dụng các thao tác load/store ghép đôi và các lệnh fused shift-insert. Ngoài ra, thư viện bao gồm các chuyên biệt hóa theo bit-width inline các vòng lặp hot, loại bỏ overhead của các lệnh gọi hàm, switch hoặc xây dựng mask trong các thao tác quan trọng.
Bit-width đề cập đến số bit cần thiết để biểu diễn mỗi giá trị dữ liệu - ví dụ, các giá trị 0-7 chỉ cần 3 bit mỗi giá trị.
Các Tối Ưu Hóa Kỹ Thuật Chính
- Xử lý song song cấp byte: Nhiều phần tử logic hơn được xử lý trên mỗi lệnh
- Xen kẽ có căn chỉnh: Các thành phần đóng góp được căn chỉnh theo ranh giới từ, hầu hết các thao tác di chuyển được thu gọn thành các phép toán đơn lệ
- Định hình lệnh: Các hàm trợ giúp khuyến khích các thao tác tải/lưu trữ được ghép đôi và các phép toán dịch chuyển-chèn được hợp nhất
- Lập lịch vi kiến trúc: Tách chuỗi, cắt giảm phạm vi hoạt động, cân bằng cổng, mở rộng các vòng lặp nóng
- Chi phí điều khiển tối thiểu: Các chuyên môn hóa theo độ rộng bit tích hợp các vòng lặp nóng mà không cần gọi hàm hoặc chuyển đổi
Thách thức và giải pháp cụ thể theo nền tảng
Kiểm tra cộng đồng đã tiết lộ những khác biệt thú vị về nền tảng, đặc biệt với bộ xử lý M1 của Apple . Một người kiểm tra phát hiện rằng chip M1 có hiệu suất đáng chú ý kém với các thao tác small-shift, điều này ảnh hưởng đến loại mã thao tác bit này. Nhà phát triển lưu ý rằng bộ xử lý M3 đã giải quyết một phần vấn đề này, trong khi chip M4 đã giải quyết hoàn toàn.
Thư viện nhắm mục tiêu phần cứng cấp máy chủ thay vì thiết bị tiêu dùng, tập trung vào khối lượng công việc kho dữ liệu và phân tích nơi băng thông bộ nhớ thường trở thành yếu tố hạn chế. Đối với các ứng dụng thực tế, nhà phát triển khuyến nghị kết hợp các thao tác bytepack với các giai đoạn xử lý khác để giữ kết quả trung gian trong các thanh ghi bộ xử lý, tối đa hóa lợi ích hiệu suất.
So sánh hiệu năng (thông lượng GB/s)
| Độ rộng bit | NEON Pack | NEON Unpack | Baseline Pack | Baseline Unpack |
|---|---|---|---|---|
| 1-bit | 90.50 | 66.80 | 38.83 | 58.94 |
| 2-bit | 104.93 | 72.88 | 48.14 | 56.17 |
| 3-bit | 84.55 | 73.11 | 40.92 | 59.56 |
| 4-bit | 95.22 | 70.09 | 52.83 | 68.66 |
| 5-bit | 80.43 | 69.70 | 39.64 | 56.96 |
| 6-bit | 79.58 | 68.11 | 44.66 | 57.56 |
| 7-bit | 66.66 | 66.20 | 38.24 | 53.96 |
| 8-bit | 79.73 | 80.17 | 58.37 | 73.35 |
Được kiểm tra trên Neoverse V2 ( Graviton4 ) với bộ làm việc 16 KiB trong bộ nhớ đệm L1
Tác động rộng hơn đến xử lý dữ liệu
Công việc này giải quyết một nút cổ chai phổ biến trong phân tích dữ liệu nơi các mảng số có giới hạn trên đã biết - chẳng hạn như mã danh mục hoặc giá trị enum - cần xử lý hiệu quả. Bằng cách đóng gói các giá trị này chặt chẽ hơn trong bộ nhớ, việc tối ưu hóa có thể tăng hiệu suất hơn gấp đôi cho các thao tác bị giới hạn bộ nhớ phổ biến trong hệ thống cơ sở dữ liệu và phân tích.
Dự án đã khơi dậy các cuộc thảo luận về khả năng của ARM NEON so với bộ lệnh x86 SIMD , với các thành viên cộng đồng chia sẻ những hiểu biết về các tính năng còn thiếu và các giải pháp thay thế. Một số lưu ý rằng trong khi NEON thiếu một số lệnh tiện lợi có trong bộ xử lý x86 , kiến trúc bộ lệnh của ARM cung cấp hỗ trợ tốt hơn cho các thao tác phần tử 8-bit và đặc tính hiệu suất có thể dự đoán hơn.
Tham khảo: NEON Bytepack
