2012-10-27 26 views
9

Thực hiện các CPU x86 khác nhau (với FPU tích hợp và gần đây hợp lý, cho ra đời millenium này) sản xuất chính xác kết quả tương tự cho các dấu phẩy động nổi của chúng, giả sử cùng một lệnh trên các CPU được so sánh, cùng đầu vào và giống nhau các thông số hoạt động như chế độ làm tròn? Tôi không quan tâm đến sự khác biệt về thời gian, cũng như trong số Pentium FDIV bug (không đủ điều kiện chỉ vì sự cố đó là cổ xưa). Tôi đoán câu trả lời là có để cộng, trừ, phủ định, và từ tròn đến số nguyên, vì chúng có định nghĩa chính xác, và tôi khó có thể tưởng tượng được sự phân kỳ trong việc triển khai có thể là gì (có lẽ ngắn của một lỗi trong phát hiện tràn/tràn, nhưng đó sẽ là một thảm họa trong một số ứng dụng, vì vậy tôi tưởng tượng điều này đã bị bắt và cố định từ lâu).Các hoạt động của FP có cho kết quả tương tự trên các CPU x86 khác nhau không?

Phép nhân dường như có nhiều khả năng thực hiện phân tách: xác định số điểm nổi chính xác kép (64 bit, bao gồm 52 + 1 mantissa) của sản phẩm của hai DPFPN đôi khi yêu cầu tính toán sản phẩm của tính tương đương của chúng với (khoảng) độ chính xác 104 bit, trong đó, đối với vài LSBits, được cho là một sự lãng phí công sức. Tôi tự hỏi nếu điều này thậm chí đã cố gắng, và thực hiện một cách chính xác. Hoặc có lẽ IEEE-754, hoặc một số tiêu chuẩn de-facto, quy định một cái gì đó?

Phân chia có vẻ tinh tế hơn.

Và, thiếu một thiết kế chung, tôi nghi ngờ tất cả việc triển khai những thứ phức tạp hơn (chức năng trig, nhật ký ..) có thể được đồng bộ chính xác, với nhiều phương pháp toán học có thể được sử dụng.

Tôi yêu cầu điều đó từ một sự kết hợp của sự tinh khiết thuần khiết; sẵn sàng cải thiện that answer of mine; và mong muốn một phương thức (đôi khi) cho phép một chương trình đang chạy trong một máy ảo để phát hiện sự không khớp giữa CPU giả vờ chạy, và thực tế.

+1

Trong khi câu hỏi rất thú vị (và tôi muốn xem câu trả lời), có vẻ như bạn không thể sử dụng điều này để phát hiện ảo hóa. Hầu hết các máy ảo tôi chạy (VMWare và KVM chủ yếu) đều có CPU vật lý được báo cáo chính xác, do đó, những sự kỳ quặc của chipset sẽ không gây ra sự không phù hợp trong trường hợp đó. – ssube

+0

Tạo mã được tối ưu hóa là một điều lớn hơn rất nhiều để lo lắng. FPU rất * rất khó để tối ưu hóa một cách nhất quán. Các trình biên dịch lý do lớn đã chuyển sang SSE2. –

+0

Tôi không đồng ý với ý kiến ​​đóng góp. Mặc dù động lực cho câu hỏi có thể không mang tính xây dựng, câu hỏi thực tế là khá hợp lệ và có thể được "hỗ trợ bởi sự kiện, tài liệu tham khảo hoặc chuyên môn cụ thể". –

Trả lời

9

Trên các chỉ lệnh cơ bản về dấu phẩy động (cộng, trừ, nhân, chia, căn bậc hai, FMA, tròn) luôn tạo ra cùng một kết quả, như được mô tả bằng chuẩn IEEE754. Có hai loại hướng dẫn có thể tạo ra các kết quả khác nhau trên các kiến ​​trúc khác nhau: hướng dẫn FPU phức tạp để tính toán các hoạt động siêu việt (FSIN, FCOS, F2XM1, và giống nhau) và hướng dẫn SSE gần đúng (RCPSS/RCPPS cho máy tính đối ứng gần đúng và RSQRTSS, RSQRTPS để tính toán căn bậc hai tương đối). Transcendental x87 FPU hoạt động được thực hiện trong microcode, và AFAIK tất cả các CPU Intel và AMD ngoại trừ AMD K5 sử dụng cùng một microcode, vì vậy bạn không thể sử dụng nó để phát hiện. Nó có thể hữu ích chỉ để phát hiện VIA, Cyrix, Transmeta, và các CPU cũ khác, nhưng những người quá hiếm để xem xét. Các chỉ lệnh SSE gần đúng được thực hiện khác nhau trên Intel và AMD, và AFAIK có một số khác biệt trong việc triển khai trên các CPU AMD cũ (trước K8) và mới hơn. Bạn có thể sử dụng sự khác biệt đó để phát hiện CPU AMD giả vờ là Intel và ngược lại, nhưng đó là trường hợp sử dụng hạn chế.

+1

Tôi đã thực hiện một số thử nghiệm ngẫu nhiên phù hợp với câu trả lời [this] (http://stackoverflow.com/a/13102431/903600) và [khác] (http://stackoverflow.com/a/13102625/903600) . Tôi đã cung cấp các bit giả ngẫu nhiên (được chuyển đổi thành dài gấp đôi 80 bit bằng cách sử dụng liên kết C) thành '/', 'sqrtl',' sinl' (được thực hiện như hướng dẫn x87) và băm kết quả (được chuyển đổi về bit), 1e6 lần. Sự khác biệt duy nhất tôi đặt là với 'sinl', trong đó có các băm khác nhau giữa Intel và AMD (nhưng nhất quán giữa PIII và Core i7, cũng như Athlon XP và Althlon 5050e). – fgrieu

2

Ngoại trừ trường hợp cực đoan được ghi lại rất rõ trong errata, TẤT CẢ Hướng dẫn IA-32 hoạt động giống nhau trên các bộ xử lý.

Ngoại lệ hiển nhiên là, tất nhiên, CPUID và quyền truy cập MSR.

Các trường hợp ngoại lệ rõ ràng là các phép toán logic, số nguyên và dấu phẩy động khác nhau. Như Maratyszcza đã viết in his answer, nhiều hoạt động phức tạp hơn được tính bằng microcode. Microcode này có thể rất khác nhau giữa các bộ vi xử lý với vi kiến ​​trúc khác nhau, nhưng kết quả được đảm bảo giống nhau.Intel, cho một (tôi không có kiến ​​thức trực tiếp về các nhà phát triển x86 khác), đầu tư nguồn lực khổng lồ để đảm bảo khả năng tương thích ngược giữa các bộ vi xử lý, thậm chí tái tạo hành vi "lỗi" (thay đổi lỗi thành thông số mới).

Nơi kiến ​​trúc hoạt động khác nhau, chẳng hạn như với VMX (Ảo hóa) và SMM (Quản lý hệ thống), cấu trúc điều khiển bao gồm ID bản sửa đổi. Tất cả các bộ vi xử lý sử dụng cùng một phiên bản ID được bảo đảm để hành xử theo cùng một cách đối với các kiến ​​trúc này.

Để trả lời câu hỏi ban đầu, các hoạt động FP, là x87, SSE hoặc AVX, cho kết quả tương tự trên tất cả các bộ xử lý, theo IEEE 754.

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