2011-12-19 35 views
5

Tôi đang làm việc về phát hiện CPU và mã phát hiện môi trường chung cho hệ điều hành sở thích của mình. Có bao giờ một trường hợp mà CPUID cần phải được gọi là nhiều lần? Đó là nếu hệ thống có nhiều lõi, hệ điều hành có cần gọi CPUID trên mỗi lõi không? Tương tự cho NUMA.CPUID trên nhiều lõi/NUMA

Cả hai hướng dẫn sử dụng CPU AMDIntel CPUID không rõ ràng về điều này. Có một bài viết trên wiki osdev đề cập đến việc gọi CPUID được gọi là Detecting CPU Topology, nhưng để đọc của tôi không rõ ràng về thời gian và số lần CPUID cần được gọi.

+0

Tôi cho rằng một tình huống mà CPUID có thể hoạt động bất thường là AMD Fusion, chứa cả CPU và GPU trên cùng một chip. Bạn sẽ phải xem tài liệu để biết thêm thông tin. Khác hơn thế, tôi không thấy lý do tại sao bất kỳ lõi CPU bên trong nào sẽ hiển thị một CPUID khác với một lõi khác. – Polynomial

+0

Bên cạnh câu trả lời đã cho, một lý do khác để gọi CPUID nhiều lần là khi sử dụng lệnh rdtsc cho phép đo hiệu suất. Bạn thường sử dụng cpuid trước đó vì cpuid là lệnh 'serializing' và ngăn chặn pipelining, nhưng cpuid cũng có thói quen khó chịu mất nhiều thời gian hơn để thực thi vài lần đầu tiên (theo hướng dẫn intel cũ trên rdtsc), gọi nó một vài lần khi khởi động để đảm bảo nó được tăng tốc, sau đó sử dụng nó trước tất cả các cuộc gọi rdtsc của bạn. –

Trả lời

3

Vì đã gần một tuần và không ai có thể trả lời câu hỏi này (có thể vì những ngày nghỉ), tôi sẽ cố gắng trả lời câu hỏi này.

Tôi nghĩ câu trả lời là có. Bạn có thể cần gọi số CPUID trên mỗi lõi. Một lý do cho điều này là không phải tất cả (thậm chí x86) hệ thống ngày nay đều đồng nhất. Ví dụ, tôi đã đọc trên diễn đàn ép xung (tôi không thể tìm thấy liên kết) có thể kết hợp hai mô hình xử lý khác nhau trên một số bo mạch máy chủ dual-socket. Người này có hệ thống dual-socket 1366 với hai bộ vi xử lý tốc độ khác nhau. (và các kiểu máy khác nhau)

Vì vậy, trong trường hợp này, hãy gọi CPUID sẽ phụ thuộc vào bộ xử lý nào đã được bật - do đó bạn sẽ cần gọi nó một lần để xử lý tất cả thông tin.

Trong sách hướng dẫn của một trong các bo mạch chủ máy chủ của tôi, nó cũng cho biết rằng bạn được phép kết hợp các bộ xử lý của các kiểu máy khác nhau (với các hạn chế nhất định). Và chắc chắn, có thể trộn hai khác nhau steppings của cùng một mô hình bộ vi xử lý.


Lý do này đơn thuần (cấu trúc liên kết không đồng nhất), đã là lý do cần gọi CPUID trên mỗi lõi.

+0

Xin lỗi vì đã trả lời rất lâu, nhưng tôi tin rằng điều này là chính xác. Mỗi CPU trên một khuôn chết cần phải có thông tin CPUID được trích xuất và lưu trữ. – nixeagle

+0

Vậy điều gì sẽ xảy ra nếu bạn gọi thành công CPUID trên mọi lõi của mỗi CPU với các bộ lệnh khác nhau; tức là một CPU có SSSE3, một SSSE4.2 khác. Sau đó, bạn sử dụng thông tin này để quyết định nhập một đoạn mã sử dụng các chỉ lệnh SSE4.2. Ở giữa của việc thực thi mã này, hệ điều hành hoán đổi chủ đề của bạn, và tiếp theo nó được lên kế hoạch trên CPU chỉ hỗ trợ tối đa SSSE3. Sau đó, sự cố mã thực hiện lệnh SSE4.1. Vì vậy, nó không đủ để thậm chí gọi CPUID trên nhiều lõi, thậm chí phải thiết lập các mối quan hệ thread sau khi làm như vậy. Điều này có đúng không? – Apriori

+0

@Apriori Điều đó nghe có vẻ khó xảy ra. Tôi biết một cấu hình Intel hoặc AMD x86 sẽ cho phép bạn cài đặt các CPU khác nhau từ các thế hệ khác nhau với các bộ lệnh khác nhau. Nhưng nếu bạn muốn quá cẩn thận, vâng, bạn có thể làm điều đó. Tôi nghĩ rằng đó là quá mức cần thiết. – Mysticial