developer tip

CPU 아키텍처 컴파일 시간 감지

copycodes 2020. 10. 17. 10:39
반응형

CPU 아키텍처 컴파일 시간 감지


C 또는 C ++ 코드를 컴파일 할 때 CPU 아키텍처를 찾는 가장 안정적인 방법은 무엇입니까? 지금까지 내가 말할 수있는, 서로 다른 컴파일러 (비 표준 처리기 정의의 자신의 세트가 _M_X86MSVS에서 __i386__, __arm__GCC에서, 등).

내가 구축중인 아키텍처를 감지 하는 표준 방법이 있습니까? 그렇지 않다면 모든 상용구가있는 헤더와 같이 다양한 컴파일러에 대한 이러한 정의의 포괄적 인 목록에 대한 소스가 #ifdef있습니까?


다음은 사전 정의 된 아키텍처 매크로 및 기타 유형의 사전 정의 된 매크로에 대한 정보입니다.

이 질문 GCC 소스 코드에서 정의 된 위치를 묻습니다 .


컴파일러 간 표준은 없지만 각 컴파일러는 매우 일관된 경향이 있습니다. 다음과 같은 헤더를 직접 작성할 수 있습니다.

#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를 나열하고 필요에 따라 헤더를 업데이트하기 만하면됩니다.


특정 플랫폼에서 사용 가능한 모든 기능을 덤프하려면 다음과 같이 GCC를 실행할 수 있습니다.

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

이 같은 매크로 덤프 것 #define __SSE3__ 1, #define __AES__ 1


크로스 컴파일러 솔루션을 원한다면 다음 Boost.Predef을 포함 하는 것을 사용하십시오.

  • BOOST_ARCH_ 시스템 / CPU 아키텍처의 경우 하나가 컴파일됩니다.
  • BOOST_COMP_ 컴파일러의 경우 사용하고 있습니다.
  • BOOST_LANG_ 언어 표준을 위해 컴파일하고 있습니다.
  • BOOST_LIB_C_ 사용중인 C 및 C ++ 표준 라이브러리의 경우 BOOST_LIB_STD_.
  • BOOST_OS_ 우리가 컴파일하는 운영 체제를 위해.
  • BOOST_PLAT_ 운영 체제 또는 컴파일러 위에있는 플랫폼 용.
  • BOOST_ENDIAN_ OS와 아키텍처 조합의 엔디안을 위해.
  • 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

여기 에서 사용 방법에 대해 자세히 알아볼 수 있습니다.


표준은 없습니다. Brian Hook은 그의 "Portable Open Source Harness"에서 이것들을 문서화했으며, 심지어 그것들을 일관되고 사용 가능한 것으로 만들려고 시도합니다. 이 사이트의 posh.h 헤더를 참조하십시오.

위의 링크는 얼마 전 DOS 공격으로 인해 가짜 사용자 ID / 암호를 입력해야 할 수도 있습니다.


If you need a fine-grained detection of CPU features, the best approach is to ship also a CPUID program which outputs to stdout or some "cpu_config.h" file the set of features supported by the CPU. Then you integrate that program with your build process.

참고URL : https://stackoverflow.com/questions/152016/detecting-cpu-architecture-compile-time

반응형