Виявлення часу компіляції архітектури процесора


82

Який найнадійніший спосіб з’ясувати архітектуру процесора під час компіляції коду C або C ++? Наскільки я можу судити, різні компілятори мають свій власний набір нестандартні визначення препроцесора ( _M_X86в МСВС, __i386__, __arm__в GCC, і т.д.).

Чи існує стандартний спосіб виявити архітектуру, для якої я будую? Якщо ні, чи існує джерело для вичерпного переліку таких визначень для різних компіляторів, наприклад заголовка з усіма шаблонними елементами #ifdef?


1
В принципі той же відповідь для визначення ОС: stackoverflow.com/questions/142508 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

Відповіді:


79

Ось деяка інформація про заздалегідь визначені архітектурні макроси та інші типи заздалегідь визначених макросів.

Це питання задає питання, де вони визначені у вихідному коді GCC.


Чи визначає стандарт C або C ++ будь-які макроси, що передбачають використання різних компіляторів.
Кришна Оза

Це здається правильним, але чи може хтось процитувати документ GCC, який говорить, що він його використовує?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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
Це не спрацювало для мене у Visual Studio 2010. _M_X86позитивно не було визначено (32-розрядна збірка). Правильним є _M_IX86(заслуга посилання Сержа вище).
Томас

6

Якщо ви хочете скинути всі доступні функції на певній платформі, ви можете запустити GCC, наприклад:

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

Це буде скидати макроси , як #define __SSE3__ 1, #define __AES__ 1і т.д.


-march=nativeне працює для ARM та MIPS для GCC 4.9 і нижче.
jww

4

Якщо ви хочете рішення для перехресного компілятора, просто використовуйте, Boost.Predefякий містить

  • BOOST_ARCH_ для архітектури системи / процесора компілюється.
  • BOOST_COMP_ для компілятора використовується один.
  • BOOST_LANG_ що стосується мовних стандартів, то хтось компілює.
  • BOOST_LIB_C_ та BOOST_LIB_STD_ для використовуваної стандартної бібліотеки C та C ++.
  • BOOST_OS_ для операційної системи, до якої ми збираємося.
  • BOOST_PLAT_ для платформ поверх операційної системи або компіляторів.
  • BOOST_ENDIAN_ за притаманність ОС та поєднання архітектури.
  • BOOST_HW_ для апаратних особливостей.
  • BOOST_HW_SIMD для виявлення SIMD (Single Instruction Multiple Data).

Наприклад

#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 щодо цього). Дивіться заголовок posh.h на цьому веб-сайті:

Зверніть увагу, що за посиланням вище може знадобитися ввести підроблений ідентифікатор користувача / пароль через атаку DOS деякий час тому.


2
Боже - вибачте за фальшиве посилання - це повинно бути на hookatooka.com/poshlib, яке надає інформацію про ідентифікатор користувача / пароль. Мій браузер повинен мати "авторизований вхід" під час попереднього відвідування сторінки.
Майкл Берр,

2
Це також варто зазначити ... Автори веб-сайту зазначили, чому вони додали пароль: "Прошу вибачення за незручності, але через незрозумілу атаку DDoS на наше попереднє пряме посилання, нам довелося створити цю сторінку, щоб" buffer 'проти DDoS ... " Я не впевнений, що справедливо покарати Майкла за це.
jww

-2

Якщо вам потрібно детально розпізнати функції центрального процесора, найкращим підходом буде також поставити програму CPUID, яка виводить на stdout або якийсь файл "cpu_config.h" набір функцій, що підтримуються процесором. Потім ви інтегруєте цю програму зі своїм процесом збірки.


3
Не буде працювати для крос-компіляції. І як скласти програму cpuid, якщо ти не знаєш, на якій машині вона повинна працювати?
jforberg
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.