2010-05-25 14 views
6

पर हाइपर-थ्रेडिंग सक्रिय है या नहीं, मैं पहले से ही इन तीनों प्लेटफार्मों पर लॉजिकल प्रोसेसर की संख्या का सही ढंग से पता लगा सकता हूं।सी/सी ++/असेंबली प्रोग्रामेटिक रूप से पता लगाता है कि क्या विंडोज, मैक और लिनक्स

भौतिक प्रोसेसर/कोर सही ढंग से संख्या का पता लगाने में सक्षम होने के लिए मुझे यह पता लगाना होगा कि क्या हाइपरथ्रेडिंग समर्थित है और सक्रिय है (या यदि आप चाहें तो सक्षम है) और यदि लॉजिकल प्रोसेसर की संख्या को 2 से निर्धारित करने के लिए भौतिक प्रोसेसर की संख्या।

Perphaps मैं एक उदाहरण प्रदान करना चाहिए:

एक क्वाड-कोर इंटेल CPU के हाइपरथ्रेडिंग सक्षम के साथ 4 शारीरिक कोर, अभी तक 8 तार्किक प्रोसेसर (हाइपरथ्रेडिंग 4 अधिक तार्किक प्रोसेसर बनाता है) है। तो मेरा वर्तमान फ़ंक्शन वांछित 4 के बजाय 8 का पता लगाएगा।

मेरा प्रश्न इसलिए है कि यह पता लगाने का कोई तरीका है कि हाइपरथ्रेडिंग समर्थित है और सक्षम है या नहीं?

उत्तर

4

लिनक्स:

भौतिक CPU की संख्या:

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

तार्किक CPU की संख्या:

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

अनुमान है कि मुझे इसका उपयोग करने के लिए मेरे प्रोग्राम में बूस्ट लाइब्रेरी से grep.cpp का उपयोग करना होगा। मेरा प्रश्न सी/सी ++/assemler के लिए विशिष्ट था जैसा कि विषय में टैग किया गया है और टैग – HTASSCPP

5

CPUID अनुदेश (जब आप EAX में समारोह 1H पारित) वे रिटर्न हाइपर थ्रेडिंग ईडीएक्स रजिस्टर के बिट 28 में फीचर फ्लैग। मुझे लगता है कि मल्टी-कोर प्रोसेसर रिपोर्ट करते हैं कि वे हाइपरथ्रेडिंग सक्षम हैं, भले ही प्रत्येक व्यक्तिगत कोर केवल एक थ्रेड चला सके।

यह ईबीएक्स के 23-16 बिट्स में प्रति भौतिक प्रोसेसर के लॉजिकल प्रोसेसर की संख्या भी देता है। मुझे लगता है कि आपको अपने सिस्टम पर सभी प्रोसेसर को हिट करने के लिए व्यक्तिगत रूप से प्रत्येक प्रोसेसर से पूछना होगा।

4

विंडोज 2003 सर्वर और विंडोज एक्सपी एसपी 3 और बाद में, आप GetLogicalProcessorInformation सिस्टम कॉल का उपयोग करके इस जानकारी को निर्धारित कर सकते हैं।

+0

क्या यह काम विंडोज 7 या विंडोज सर्वर 2008 आरसी 2 कहता है? या फिर मुझे GetLogicalProcessorInformation का उपयोग करना चाहिए? – HTASSCPP

+0

msdn पृष्ठ SYSTEM_LOGICAL_PROCESSOR_INFORMATION :: ProcessorCore.Flags फ़ील्ड के बारे में बताता है "यदि इस सदस्य का मान 1 है, तो प्रोसेसरमास्क सदस्य के मूल्य द्वारा पहचाने गए लॉजिकल प्रोसेसर हाइपरथ्रेडिंग या एसएमटी में कार्यात्मक इकाइयों को साझा करते हैं। अन्यथा, पहचान किए गए तार्किक प्रोसेसर कार्यात्मक इकाइयों को साझा नहीं करते हैं। " लेकिन यह भी कहता है कि Windows Vista से पहले मान गलत है, और उसके बाद केवल तार्किक प्रोसेसर एक ही भौतिक पैकेज में हैं। और समस्याएं हैं: यह वास्तव में निर्दिष्ट नहीं है कि कॉल लॉजिकल प्रोसेसर को उपयोगी तरीके से समूहित करेगा। –

3

ओएस एक्स पर:

#include <sys/sysctl.h> 

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

शीर्ष लेख या अधिक जानकारी के लिए मैनपेज देखें। (ध्यान दें कि आप "hw.logicalcpu" स्ट्रिंग का उपयोग करके, उसी तरह लॉजिकल सीपीयू की संख्या प्राप्त कर सकते हैं)

+0

उन सभी मशीनों पर पूरी तरह से काम करता है जिन पर मैंने इसका परीक्षण किया है, धन्यवाद! – HTASSCPP

संबंधित मुद्दे