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.