2012-09-23 38 views
5

Tôi có thể tạo nhị phân chung cho Mac OS X có chứa hai phiên bản ứng dụng của tôi, phiên bản được biên dịch bằng SSE4.2 và một phiên bản được biên dịch bằng SSE3 không?Universal nhị phân cho các phiên bản SSE khác nhau

Trong trường hợp này, tôi sẽ phiên bản được biên dịch với SSE4.2 để được tải tự động cho CPU hỗ trợ SSE4.2.

Nếu không, tôi muốn nhận đề xuất chạy ứng dụng của tôi trên các CPU cũ không hỗ trợ SSE4.2 nhưng sử dụng SSE4.2 trên CPU hỗ trợ nó.

Lưu ý rằng tôi nhắm mục tiêu đến Mac AppStore, nếu vấn đề đó. Tôi sử dụng Clang với Xcode 4.5.

+0

Tất cả những gì bạn cần làm là: 1) Phát hiện tập lệnh. 2) Chi nhánh cho phiên bản mà bạn muốn. – Mysticial

+0

[Câu trả lời của tôi ở đây cho thấy cách phát hiện tập lệnh.] (Http://stackoverflow.com/a/7495023/922184) Nội tại '__cpuid()' cụ thể đối với MSVC. Trong GCC, bạn có thể truy cập nó bằng cách sử dụng lắp ráp nội tuyến. Tôi không chắc chắn những gì bạn đang sử dụng mặc dù, nhưng cần có một cách để truy cập nó. – Mysticial

+0

Tôi không muốn thay đổi các tệp mã nguồn vì một số dòng không chạy được trên các CPU cũ đến từ các dự án nguồn mở của bên thứ ba. –

Trả lời

3

Điều này không được hỗ trợ bởi định dạng Mach-O, được sử dụng bởi Mac OS X. Định dạng cho phép nhị phân cho các kiến ​​trúc khác nhau. Có một trường loại phụ, nhưng chỉ có các giá trị được xác định cho các thế hệ bộ vi xử lý khác nhau, chứ không phải khả năng của chúng.

Có một số cách để giải quyết vấn đề này. Một sẽ có cả SSE4.2 và mã cho các bộ vi xử lý cũ được xây dựng trong cùng một hệ nhị phân, sử dụng các tên hàm khác nhau. Mã của bạn sẽ xác định có hỗ trợ SSE4.2 hay không, sau đó gọi hàm thích hợp.

Một tùy chọn khác là xây dựng hai thư viện, một với SSE4.2 và một thư mục không có, và gửi cả hai thư viện trong gói ứng dụng của bạn, nhưng không liên kết với chúng. Khi lần đầu tiên được tải, mã của bạn sẽ xác định xem SSE4.2 có được hỗ trợ hay không và sau đó tải đúng thư viện.

Sử dụng phương pháp đầu tiên, bạn không phải lo lắng về việc tải thư viện và kết nối tất cả các hàm, nhưng bạn sẽ luôn tải thêm mã không được thực hiện và bạn sẽ phải kiểm tra biến trước mỗi của các cuộc gọi hàm đó. Sử dụng phương thức thứ hai, bạn có thể chỉ cần gọi các hàm mà không kiểm tra bất cứ điều gì mỗi lần, nhưng việc tải thư viện và kết nối tất cả các hàm là nhiều công việc hơn là chỉ so sánh một biến mỗi lần.

Các vấn đề liên quan