सीपीयू आर्किटेक्चर का संकलन-समय का पता लगाना


82

C या C ++ कोड का संकलन करते समय CPU आर्किटेक्चर का पता लगाने का सबसे विश्वसनीय तरीका क्या है? जहाँ तक मेरा बता सकते हैं, विभिन्न compilers अमानक पूर्वप्रक्रमक परिभाषाओं के अपने स्वयं के सेट (है _M_X86MSVS में, __i386__, __arm__जीसीसी में, आदि)।

क्या मैं जिस वास्तुकला का निर्माण कर रहा हूं, उसका पता लगाने का एक मानक तरीका है? यदि नहीं, तो क्या विभिन्न बॉयलर के लिए ऐसी परिभाषाओं की एक व्यापक सूची के लिए एक स्रोत है, जैसे कि सभी बॉयलरप्लेट के साथ हेडर #ifdef?


1
मूल रूप से OS का पता लगाने के लिए एक ही उत्तर: stackoverflow.com/questions/142508/…
Ciro Santilli 病 for for for

जवाबों:


79

यहाँ पूर्व-परिभाषित आर्किटेक्चर मैक्रोज़ और अन्य प्रकार के पूर्व-परिभाषित मैक्रोज़ के बारे में कुछ जानकारी दी गई है ।

यह सवाल पूछता है कि उन्हें जीसीसी स्रोत कोड में कहां परिभाषित किया गया है।


क्या सी या सी ++ मानक किसी भी विचारोत्तेजक मैक्रोज़ को अलग-अलग संकलक द्वारा उपयोग करने के लिए परिभाषित करता है।
कृष्णा ओझा

यह सही लगता है, लेकिन क्या कोई जीसीसी डॉक को उद्धृत कर सकता है जो कहता है कि यह इसका उपयोग करता है?
Ciro Santilli 郝海东 冠状 iro i 法轮功 '

15

कोई अंतर-संकलक मानक नहीं है, लेकिन प्रत्येक संकलक काफी सुसंगत है। आप अपने लिए एक हेडर बना सकते हैं जो कुछ इस तरह से हो:

#if MSVC
#ifdef _M_X86
#define ARCH_X86
#endif
#endif

#if GCC
#ifdef __i386__
#define ARCH_X86
#endif
#endif

एक व्यापक सूची के लिए बहुत अधिक बिंदु नहीं है, क्योंकि हजारों संकलक हैं लेकिन व्यापक उपयोग में केवल 3-4 (Microsoft C ++, GCC, Intel CC, शायद TenDRA?)। बस यह तय करें कि आपका एप्लिकेशन किन कंपाइलरों का समर्थन करेगा, उनके #defines को सूचीबद्ध करेगा, और आवश्यकतानुसार आपके हेडर को अपडेट करेगा।


4
यह दृश्य स्टूडियो 2010 पर मेरे लिए काम नहीं किया। _M_X86सकारात्मक रूप से परिभाषित नहीं किया गया था (32-बिट बिल्ड)। सही एक है _M_IX86(ऊपर सर्ज के लिंक का श्रेय)।
थॉमस

6

यदि आप किसी विशेष प्लेटफॉर्म पर सभी उपलब्ध सुविधाओं को डंप करना चाहते हैं, तो आप जीसीसी चला सकते हैं:

gcc -march=native -dM -E - </dev/null

यह मैक्रोज़ को डंप करेगा #define __SSE3__ 1, जैसे #define __AES__ 1, आदि।


-march=nativeARM और MIPS के लिए GCC 4.9 और उससे नीचे के लिए विफल रहता है।
jww

4

यदि आप एक क्रॉस-कंपाइलर समाधान चाहते हैं, तो बस उपयोग करें Boost.Predefजिसमें शामिल है

  • BOOST_ARCH_ प्रणाली / सीपीयू वास्तुकला के लिए एक संकलन है।
  • BOOST_COMP_ संकलक के लिए एक का उपयोग कर रहा है।
  • BOOST_LANG_ भाषा मानकों के लिए एक के खिलाफ संकलन है।
  • BOOST_LIB_C_ और C और C ++ मानक पुस्तकालय में उपयोग के लिए BOOST_LIB_STD_।
  • BOOST_OS_ ऑपरेटिंग सिस्टम के लिए हम संकलित कर रहे हैं।
  • BOOST_PLAT_ ऑपरेटिंग सिस्टम या कंपाइलर के शीर्ष पर प्लेटफार्मों के लिए।
  • BOOST_ENDIAN_ ओएस और वास्तुकला संयोजन के अंत के लिए।
  • BOOST_HW_ हार्डवेयर विशिष्ट सुविधाओं के लिए।
  • BOOST_HW_SIMD SIMD (एकल निर्देश एकाधिक डेटा) का पता लगाने के लिए।

उदाहरण के लिए

#if defined(BOOST_ARCH_X86)
    #if BOOST_ARCH_X86_64
        std::cout << "x86_64 " << BOOST_ARCH_X86_64 << " \n";
    #elif BOOST_ARCH_X86_32
        std::cout << "x86 " << BOOST_ARCH_X86_32 << " \n";
    #endif
#elif defined(BOOST_ARCH_ARM)
    #if _M_ARM
        std::cout << "ARM " << _M_ARM << " \n";
    #elif _M_ARM64
        std::cout << "ARM64 " << _M_ARM64 << " \n";
    #endif
#endif

आप बाहर है कि यह कैसे उपयोग करने के लिए के बारे में अधिक प्राप्त कर सकते हैं यहां


3

कोई मानक नहीं है। ब्रायन हुक ने अपने "पोर्टेबल ओपन सोर्स हार्नेस" में इनमें से एक गुच्छा का दस्तावेजीकरण किया, और यहां तक ​​कि उन्हें कुछ सुसंगत और प्रयोग करने योग्य बनाने की कोशिश की (उस बारे में ymmv)। इस साइट पर पॉश शीर्षक देखें:

ध्यान दें, ऊपर दिए गए लिंक से आपको कुछ समय पहले DOS हमले के कारण कुछ फर्जी उपयोगकर्ता / पासवर्ड दर्ज करने की आवश्यकता हो सकती है।


2
जीज़ - फर्जी लिंक के बारे में खेद है - यह हुकटूक डॉट कॉम / एक्सपोजिब को होना चाहिए जो उपयोगकर्ता के पासवर्ड या पासवर्ड के बारे में जानकारी देता है। मेरे ब्राउज़र में पृष्ठ के कुछ पिछली यात्रा से 'ऑटो लॉग इन' होना चाहिए।
माइकल बूर

2
यह भी ध्यान देने योग्य है ... वेबसाइट के लेखकों ने कहा कि उन्होंने एक पासवर्ड क्यों जोड़ा: "मैं असुविधा के लिए माफी मांगता हूं, लेकिन हमारे पहले प्रत्यक्ष लिंक पर बेवजह डीडीओएस हमले के कारण, हमें यह पृष्ठ बनाना होगा ' DDoS के खिलाफ 'बफर ... " मुझे यकीन नहीं है कि इसके लिए माइकल को दंडित करना उचित होगा।
jww

-2

यदि आपको सीपीयू सुविधाओं का ठीक-ठीक पता लगाने की आवश्यकता है, तो सबसे अच्छा तरीका यह है कि सीपीयूआईडी प्रोग्राम को भी शिप किया जाए, जो कि सीपीयू या कुछ "cpu_config.h" आउटपुट के लिए सीपीयू द्वारा समर्थित सुविधाओं के सेट को फाइल करता है। फिर आप अपनी बिल्ड प्रक्रिया के साथ उस प्रोग्राम को एकीकृत करते हैं।


3
क्रॉस संकलन के लिए काम नहीं करेगा। और जब तक आप यह नहीं जानते कि किस मशीन को चलाने की आवश्यकता है, आप एक स्पष्ट कार्यक्रम कैसे संकलित करते हैं?
जेन्फबर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.