Các bộ xử lý RISC-V đang ngày càng hướng đến instruction fusion như một cách để thu hẹp khoảng cách do thiếu các lệnh conditional move truyền thống trong kiến trúc này. Tuy nhiên, một vấn đề kỹ thuật quan trọng đã xuất hiện có thể làm suy yếu những nỗ lực tối ưu hóa này, có khả năng buộc các nhà thiết kế phần cứng phải suy nghĩ lại cách tiếp cận để cải thiện hiệu suất RISC-V.
Không giống như họ lệnh csel mạnh mẽ của ARM có thể xử lý các phép toán điều kiện phức tạp trong một lệnh duy nhất, RISC-V dựa vào các extension đơn giản hơn như Zicond và mong đợi các lõi xử lý sử dụng instruction fusion để kết hợp nhiều lệnh cơ bản thành các phép toán hiệu quả hơn. Cách tiếp cận này có vẻ hứa hẹn cho đến khi các nhà phát triển phát hiện ra xung đột cơ bản với memory consistency model của RISC-V.
Memory Ordering tạo ra rào cản cho Fusion
Vấn đề cốt lõi nằm ở cách RISC-V xử lý control dependencies và các phép toán bộ nhớ. Khi một bộ xử lý cố gắng kết hợp một conditional branch với một lệnh khác để tạo ra một phép toán không có branch, nó vô tình thay đổi các đảm bảo memory ordering mà các lõi xử lý khác mong đợi thấy. Trong memory model của RISC-V, mỗi lệnh branch tạo ra một control dependency ảnh hưởng đến tất cả các phép toán store tiếp theo, ngay cả khi branch đó không thực sự thay đổi luồng chương trình.
Các cuộc thảo luận cộng đồng cho thấy đây không chỉ là một mối quan tâm lý thuyết. Như một chuyên gia kỹ thuật đã lưu ý, lệnh được fusion sẽ cần giữ lại các thuộc tính giống như branch để tránh vi phạm memory model. Điều này có nghĩa là các cách tiếp cận fusion đơn giản được sử dụng thành công trong các bộ xử lý x86 và ARM có thể không hoạt động trực tiếp trong các hệ thống RISC-V.
Control dependency: Một mối quan hệ trong đó việc thực thi một lệnh phụ thuộc vào kết quả của một phép toán điều kiện, ảnh hưởng đến cách các phép toán bộ nhớ có thể được sắp xếp lại.
Tác Động Của Mô Hình Bộ Nhớ Lên Việc Hợp Nhất Lệnh
Biến Đổi Có Vấn Đề:
- Trước khi hợp nhất: Nhánh tạo ra phụ thuộc điều khiển ảnh hưởng đến tất cả các thao tác lưu trữ tiếp theo
- Sau khi hợp nhất: Chỉ còn lại các phụ thuộc dữ liệu/địa chỉ, đảm bảo thứ tự yếu hơn
- Kết quả: Khả năng vi phạm mô hình bộ nhớ có thể nhìn thấy từ các lõi xử lý khác
Giải Pháp Cần Thiết:
- Các lệnh được hợp nhất phải giữ lại các thuộc tính thứ tự bộ nhớ giống như nhánh
- Có thể cần thêm các thao tác fence
- Kiến trúc vi mô phức tạp hơn để xử lý các yêu cầu về thứ tự
Vendor Extensions lấp đầy khoảng trống
Trong khi đặc tả chính thức của RISC-V đang vật lộn với thách thức này, các nhà cung cấp phần cứng đã tự mình giải quyết vấn đề. Các công ty đang triển khai các conditional move extension riêng của họ, bao gồm xtheadcondmov và xmipscmove, cung cấp chức năng mà nhiều nhà phát triển mong đợi tìm thấy trong kiến trúc cơ bản.
Phản ứng của cộng đồng khá trái chiều, với một số nhà phát triển đặt câu hỏi liệu các nguyên tắc thiết kế của RISC-V có quá hạn chế hay không. Cam kết của kiến trúc này trong việc giới hạn các lệnh chỉ có hai source register đã tạo ra những phức tạp mà các kiến trúc cạnh tranh tránh được bằng cách hỗ trợ các phép toán ba register.
So sánh các Extension Conditional Move của RISC-V
| Extension | Loại | Mô tả |
|---|---|---|
| Zicond | Chính thức | Các phép toán conditional zero hạn chế, yêu cầu nhiều lệnh |
| xtheadcondmov | Đặc thù nhà cung cấp | Hỗ trợ conditional move đầy đủ ( T-Head ) |
| xmipscmove | Đặc thù nhà cung cấp | Hỗ trợ conditional move đầy đủ (công ty MIPS ) |
| P extension | Chính thức đang phát triển | Bao gồm các lệnh MVM, MVMN, MERGE cho các phép toán packed |
Tác động hiệu suất trên các loại Core khác nhau
Các thách thức fusion ảnh hưởng đến các thiết kế bộ xử lý khác nhau theo những cách khác nhau. Các lõi RISC-V nhỏ hơn, đơn giản hơn không sắp xếp lại các phép toán bộ nhớ có thể không gặp phải vấn đề đáng kể. Tuy nhiên, các lõi lớn hơn, phức tạp hơn dựa vào các kỹ thuật tối ưu hóa tinh vi thấy mình cần thêm độ phức tạp phần cứng để xử lý các yêu cầu memory model.
Một số nhà sản xuất đang khám phá các cách tiếp cận thay thế, chẳng hạn như chia tách các execution unit để cung cấp cấu hình register port linh hoạt. Điều này cho phép các lõi xử lý cả các phép toán hai register đơn giản một cách hiệu quả trong khi vẫn hỗ trợ các phép toán ba register phức tạp hơn khi cần thiết, mặc dù với chi phí là độ phức tạp scheduling bổ sung.
Nhìn về tương lai
Cộng đồng RISC-V đang tích cực làm việc trên các giải pháp, với các extension mới hơn như P extension (packed integer SIMD) bắt đầu bao gồm các lệnh select ba register thích hợp. Tuy nhiên, những giải pháp này vẫn còn rải rác trên các tài liệu đặc tả khác nhau và chưa được triển khai rộng rãi.
Tình hình này làm nổi bật một thách thức rộng lớn hơn mà RISC-V đang đối mặt khi nó trưởng thành từ một dự án học thuật thành một kiến trúc thương mại. Trong khi triết lý thiết kế giữ mọi thứ đơn giản có những lợi ích, đôi khi nó tạo ra những phức tạp bất ngờ khi cố gắng đạt được hiệu suất cạnh tranh với các kiến trúc đã được thiết lập.
Hiện tại, những người triển khai RISC-V phải cân bằng cẩn thận giữa mong muốn tối ưu hóa hiệu suất và các ràng buộc do memory model và nguyên tắc thiết kế của kiến trúc áp đặt. Giải pháp cuối cùng có thể yêu cầu hoặc là nới lỏng một số ràng buộc thiết kế hoặc phát triển các kỹ thuật fusion tinh vi hơn có thể xử lý đúng cách các yêu cầu memory ordering.
Tham khảo: RISC-V Conditional Moves
