2010-05-25 27 views
6

Tôi đã có thể phát hiện chính xác số lượng bộ xử lý logic chính xác trên cả ba nền tảng này.C/C++/Assembly Lập trình phát hiện nếu siêu luồng đang hoạt động trên Windows, Mac và Linux

Để có thể phát hiện số lượng bộ xử lý vật lý/lõi chính xác, tôi sẽ phải phát hiện nếu siêu phân luồng được hỗ trợ VÀ hoạt động (hoặc được bật nếu bạn thích) và nếu chia số lượng bộ xử lý logic cho 2 để xác định số lượng bộ xử lý vật lý.

Perphaps tôi nên cung cấp một ví dụ:

Một lõi tứ Intel CPU với hyperthreading kích hoạt có 4 lõi vật lý, tuy nhiên 8 bộ xử lý logic (hyperthreading tạo 4 bộ vi xử lý hợp lý hơn). Vì vậy, chức năng hiện tại của tôi sẽ phát hiện 8 thay vì mong muốn 4.

Do đó, câu hỏi của tôi là nếu có cách nào để phát hiện xem siêu phân luồng có được hỗ trợ VÀ BẬT?

Trả lời

4

Linux:

Số CPU vật lý:

grep -i "physical id" /proc/cpuinfo | sort -u | wc -l 

Số CPU logic:

grep -i "processor" /proc/cpuinfo | sort -u | wc -l 
+0

đoán tôi sẽ phải sử dụng grep.cpp từ thư viện tăng cường trong chương trình của tôi để sử dụng. Câu hỏi của tôi là cụ thể đối với c/C++/assemler như đã lưu ý trong chủ đề và các thẻ – HTASSCPP

5

Các hướng dẫn CPUID (khi bạn vượt qua chức năng 1H trong EAX) trả về họ luồng hyper cờ tính năng ở bit 28 của thanh ghi EDX. Tôi nghĩ rằng các bộ vi xử lý đa lõi báo cáo rằng chúng được kích hoạt siêu phân luồng mặc dù mỗi lõi riêng lẻ chỉ có thể chạy một luồng.

Nó cũng trả về số lượng bộ xử lý logic trên mỗi bộ xử lý vật lý trong các bit 23-16 của EBX. Tôi nghĩ rằng bạn sẽ phải truy vấn từng bộ xử lý riêng lẻ để đạt được tất cả các bộ xử lý trên hệ thống của bạn.

4

Trên Windows 2003 Server và Windows XP SP3 trở lên, bạn có thể xác định thông tin này bằng cách sử dụng cuộc gọi hệ thống GetLogicalProcessorInformation.

+0

Tính năng này có hoạt động trên cho phép nói Windows 7 hoặc Windows Server 2008 RC2 không? Hoặc tôi nên sử dụng GetLogicalProcessorInformation sau đó? – HTASSCPP

+0

Trang msdn nói về trường SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: ProcessorCore.Flags "Nếu giá trị của thành viên này là 1, bộ xử lý logic được xác định bởi giá trị của các thành phần bộ xử lý chia sẻ thành phần ProcessorMask, như trong Siêu phân luồng hoặc SMT. bộ vi xử lý không chia sẻ các đơn vị chức năng. " Nhưng nó cũng nói rằng giá trị là sai trước khi Windows Vista, và sau đó chỉ có nghĩa là các bộ vi xử lý hợp lý trong cùng một gói vật lý. Có nhiều vấn đề hơn: nó thực sự không được chỉ định rằng cuộc gọi sẽ nhóm các bộ xử lý logic một cách hữu ích. –

3

Trên OS X:

#include <sys/sysctl.h> 

int physicalCores; 
sysctlbyname("hw.physicalcpu", &physicalCores, sizeof(physicalCores), NULL, 0); 

Xem header hoặc manpage để biết thêm thông tin. (Lưu ý rằng bạn có thể nhận được số lượng cpus hợp lý theo cùng một cách, sử dụng chuỗi "hw.logicalcpu")

+0

Hoạt động đúng trên tất cả các máy tôi đã thử nghiệm tính năng này, cảm ơn! – HTASSCPP

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