Tiện ích mở rộng giới thiệu trạng thái kiến trúc mới yêu cầu hỗ trợ hệ điều hành đặc biệt, vì hệ điều hành phải lưu/khôi phục khôi phục nhiều dữ liệu hơn trên các công tắc ngữ cảnh. Vì vậy, từ quan điểm của hệ điều hành, không cần thêm gì để cho phép mã không gian người dùng chạy các lệnh SSSE3, nếu hệ điều hành hỗ trợ SSE.
SSE, AVX và AVX512 là các tiện ích mở rộng giới thiệu trạng thái kiến trúc mới.
- SSE giới thiệu regs XMM (và MXCSR để làm tròn các chế độ và FP trạng thái ngoại lệ)
- AVX giới thiệu YMM (nửa dưới trong số đó là các regs XMM cũ).
- AVX512 giới thiệu zmm (mở rộng số ymm) và cũng tăng gấp đôi số lần kiểm tra vectơ ở chế độ 64 bit: zmm0-zmm31.
Bạn kiểm tra xem có hỗ trợ CPU cho SSE hoặc AVX theo cách thông thường, với sự hướng dẫn CPUID.
Để ngăn không cho dữ liệu bị hỏng khi sử dụng phần mở rộng mới trên hệ điều hành đa nhiệm không lưu/khôi phục trạng thái kiến trúc mới trên thiết bị chuyển ngữ cảnh, SSE hướng dẫn lỗi như hướng dẫn bất hợp pháp nếu hệ điều hành không có set an OS-support bit in a control register. Vì vậy, các phần mở rộng vector "không hoạt động" trên các hệ điều hành không biết về việc lưu/khôi phục trạng thái cần thiết cho tiện ích mở rộng đó.
Đối với SSE, có thể không có bất kỳ cách nào hệ điều hành độc lập sạch để phát hiện rằng hệ điều hành đã hứa sẽ lưu/khôi phục trạng thái SSE trên switch bối cảnh bằng cách thiết lập CR4.OSFXSR
, CR4.OSXMMEXCPT
, vv bit, vì even reading a control register is privileged và không có bit CPUID phản ánh cài đặt. Trên Windows, bạn có thể sử dụng GetEnabledXStateFeatures
để kiểm tra xem hệ điều hành có biết cách lưu/khôi phục trạng thái đăng ký véc tơ hay không. Tôi không chắc chắn những gì bạn cần trên các hệ điều hành khác; Hỗ trợ SSE quá phổ biến đến nỗi bạn phải sử dụng hệ điều hành (hoặc homebrew) thực sự cổ đại để giải quyết vấn đề này.
Đối AVX, chúng tôi không cần sự hỗ trợ hệ điều hành để phát hiện rằng AVX là có thể sử dụng (được hỗ trợ bởi phần cứng và kích hoạt hệ điều hành): CPUID bao gồm một tính năng chút OSXSAVE sẽ được thiết lập khi hệ điều hành có đã bật AVX.
Từ Intel's intro to AVX:
- Xác minh rằng các hệ điều hành hỗ trợ XGETBV sử dụng
CPUID.1:ECX.OSXSAVE bit 27 = 1
.
- Đồng thời, xác minh rằng
CPUID.1:ECX bit 28=1
(Intel AVX hỗ trợ) và/hoặc cắn 25 = 1 (AES hỗ trợ) ... (và bit khác cho FMA, AES, và PCLMULQDQ)
- Issue
XGETBV
và xác minh rằng mặt nạ bật tính năng tại bit 1 và 2 là 11b
(trạng thái XMM và trạng thái YMM được bật bởi hệ điều hành ).
Nó có thể được dễ dàng hơn để gọi một chức năng hệ điều hành cung cấp để phát hiện hỗ trợ hệ điều hành, thay vì sử dụng asm inline hoặc một thư viện tính năng phát hiện để làm tất cả điều này.
Điều này cũng đúng cho AVX512: bạn có thể kiểm tra các bit tính năng CPUID cho các tập lệnh, và kiểm tra mà hệ điều hành đã hứa sẽ quản lý trạng thái kiến trúc mới trên bối cảnh chuyển mạch bằng cách cho phép các bit ngay trong với XSETBV. (Vì vậy, bạn nên kiểm tra với XGETBV).
@ downvoters: Đây không phải là một câu hỏi xấu, so với hầu hết, ngay cả khi nó quay ra không có một câu trả lời rất thú vị. OP không biết điều đó, hoặc anh ta sẽ không hỏi. Rõ ràng và có vẻ như OP đã cố gắng nghiên cứu, nhưng không biết phải tìm kiếm gì (bởi vì anh ta chưa biết câu trả lời cho câu hỏi: P) Tôi có thể thấy việc đóng nó là chủ đề cho SO/migrate để SU, nhưng không phải là downvotes. –
Tôi không nghĩ rằng đó là một câu hỏi SU, tôi nghi ngờ mã hóa trong lắp ráp là một cái gì đó ngay cả những người dùng siêu nhất làm. Tôi sẽ reword câu hỏi để làm cho nó rõ ràng hơn rằng tôi đang cố gắng sử dụng các opcodes trong các chương trình của tôi. – Alexey
Tôi không thấy làm thế nào câu hỏi này chỉ là "về phần mềm máy tính nói chung". Thực tế duy nhất là nó chứa "Windows" không có nghĩa là nó không có chủ đề ở đây. Đây là một câu hỏi về các nền tảng từ quan điểm của các lập trình viên, và nó rõ ràng là quan trọng đối với những người viết mã trong SSE/AVX/etc. – stgatilov