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


82

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

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


답변:


79

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

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


C 또는 C ++ 표준은 다른 컴파일러에서 사용할 제안 매크로를 정의합니까?
— Krishna Oza

이것은 정확 해 보이지만 누군가 그것을 사용한다고 말하는 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(위의 Serge 링크에 대한 크레딧)입니다.
— Thomas

6

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

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

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


-march=nativeGCC 4.9 이하의 ARM 및 MIPS에서는 실패합니다.
— jww

4

크로스 컴파일러 솔루션을 원한다면 다음 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

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


3

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

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


2
Jeez- 가짜 링크에 대해 죄송합니다- 사용자 ID / 암호에 대한 정보를 제공 하는 hookatooka.com/poshlib에 있어야 합니다. 내 브라우저는 이전 페이지 방문에서 '자동 로그인'되어 있어야합니다.
— Michael Burr

2
또한 주목할 가치가 있습니다 ... 웹 사이트 작성자는 비밀번호를 추가 한 이유를 다음과 같이 언급했습니다. "불편을 끼쳐 드려 죄송하지만 이전 직접 링크에 대한 설명 할 수없는 DDoS 공격으로 인해이 페이지를 '로 만들어야했습니다. DDoS에 대한 버퍼 '... " 마이클에게 벌칙을 부과하는 것이 공정한지 모르겠습니다.
— jww

-2

CPU 기능을 세밀하게 감지해야하는 경우 가장 좋은 방법은 CPU에서 지원하는 기능 집합을 stdout 또는 일부 "cpu_config.h"파일로 출력하는 CPUID 프로그램도 함께 제공하는 것입니다. 그런 다음 해당 프로그램을 빌드 프로세스와 통합합니다.


3
크로스 컴파일에는 작동하지 않습니다. 그리고 어떤 컴퓨터에서 실행해야할지 모르는 경우 cpuid 프로그램을 어떻게 컴파일합니까?
— jforberg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.