2012-02-13 1 views
6

__cpuid()으로 CPU에 대한 정보를 수집하려고합니다. 내 컴퓨터에서 제대로 작동하지만 내 컴퓨터에서 내 프로그램을 실행하면 Intel Core2 Quad Q6600이 하이퍼 스레드로 인식되지만 인텔 자체 사이트의 사양에 따르면 그렇지 않습니다.CPUID를 사용하여 CPU 사양을 감지하고 신뢰할 수있는 솔루션을 찾으십니까?

__cpuid()도 여기에 표시 될 수있는 것처럼 "논리적 코어"의 잘못된 양을 감지하고 있습니다 : Programmatically detect number of physical processors/cores or if hyper-threading is active on Windows, Mac and Linux. Intel Xeon E5520에는 16 개의 논리적 코어와 8 개의 물리적 코어가 있다고 주장하는 곳입니다.

내 컴퓨터에서 해당 스레드에서 발견 된 코드를 실행 해 보았습니다. Intel i7 2600K은 제온과 동일한 번호를 부여합니다.

그래야 얼마나 __cpuid()의 신뢰성이 있습니까? 내 자신의 경험으로 볼 때 그것은 그다지 신뢰할만한 것 같지 않습니다. 아주 근본적으로 잘못된 것이 있습니까?

+0

__cpuid() 사용에 익숙하지 않은 경우. OpenMP omp_get_num_procs()를 사용하면 CPU가 동시에 실행할 수있는 스레드의 양을 반환해야합니다. 나는이 정보가 얼마나 신뢰할 수 있는지 잘 모른다. 나는 이런 식으로 전혀 문제가 없었습니다. – Compuholic

+0

CPUID는 일반적으로 상당히 안정적이지만 때로는 오도되거나 잘못 될 수 있습니다. CPU가 하나의 기능을 지원할 수는 있지만 마더 보드는 비활성화되어 있기 때문에 현재 상태로보고되지만 작동하지는 않습니다. 저기 도서관 CPUID를 가지고 조금 더 신뢰할 수 있도록, 교정 등의 데이터베이스와 함께 노력하고 있습니다. – Kitsune

+0

그러나 CPU가 하이퍼 스레딩과 CPUID를 지원하지 않는다면 현재있는 정보가 마더 보드의 문제라는 것을 알 수 있습니다. CPU가 HTT를 지원하지만 마더 보드 및 테러는 지원하지 않는다는 것을 알 수 있습니다. 당신은 HTT를 확인할 때 거짓을 얻습니다. – Alex

답변

3

CPUID를 신뢰할 수 있으면 올바르게 사용해야합니다. 이 경우 토폴로지를 올바르게 열거한다는 의미입니다. 16 개의 논리 프로세서를 얻습니다. 왜냐하면 그 필드는 지원할 수있는 최대 값을 나타내는 것이지 실제로 존재하는 값의 수가 많기 때문입니다. 코어에 대해 검색된 값은 실제로 논리적 개수입니다.

내 시스템 (i7 2720QM)에서 항목의 코드는 매우 기본적인 것이며 시작점으로 의미가 있습니다. 또한 잘못된 데이터를 기록하지만 인텔 CPUID 매핑에 따라 토폴로지를 검사하는 내 자신의 코드를 사용하면 정확합니다. 결과.

1

프로세서의 [x2] APIC ID에 거의 차이가 있습니다. 즉, APIC ID의 일부 값이 논리 프로세서에 매핑되지 않습니다. 찾으려면 cpuid의 0xB 잎을 사용해야합니다. 참조 용 인텔 코드 및 알고리즘 (https://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration/)을 참조 할 수 있지만 EAX = 0xB, ECX = 0으로 호출하고 EBX에서 코어 당 논리 프로세서 (스레드) 수를 얻은 다음 cpuid를 다시 호출합니다 EAX = 0xB, ECX = 1 및 프로세서 패키지 당 논리 프로세서 수를 EBX로 표시합니다.

리프 0x1을 사용하는 이전 방법은 APIC ID 갭을 설명 할 수 없습니다. 아아 그 샘플 코드는 MSDN Visual C++ 2013 참조 페이지 (http://msdn.microsoft.com/en-us/library/hskdteyh.aspx) 및 에서 제공된 것으로 2010 년 이후에 만들어진 프로세서는으로 잘못되었습니다. MSDN의 코드 또는 다른 위치의 잘못된 코드를 사용했는지 알 수 있습니다 . 문제를 이해하기 위해 고생 한 후 최근에 업데이트 한 cpuid의 Wikipedia 페이지에는 APIC ID 간격이있는 프로세서의 토폴로지를 열거하기위한 "Intel 스레드/코어 및 캐시 토폴로지"섹션의 예제가 있습니다. APIC ID 중 어떤 비트가 실제로 사용되고 어떤 비트가 "죽었는지"를 결정하는 방법을 포함한 추가 세부 정보가 포함되어 있습니다.

Microsoft가 현재 __cpuid() 페이지에서 제공하는 코드 샘플을 보면이 코드는 Logical CPU count return 16 instead of 4과 기본적으로 동일한 질문입니다. 이는 Intel 사양과 동일한 해석 오류를 뿌리 내리기 때문입니다. MSDN의 열악한 프로그램에 대한 설명으로, 그들이 제공하는 코드는 2010 년 이전에 정상적으로 작동했습니다. 인텔은 이전 비디오/기사에서 볼 수 있듯이 x2APIC을 도입하기 전에 비슷한 방법을 제공했습니다. __cpuid에 대한 MSDN 페이지의 다양한 버전을 살펴보면 코드 샘플은 기본적으로 2008 년 이후로 동일하게 유지됩니다.

더 긴 이야기 인 하나의 하이퍼 스레딩 감지 비트에 대해서는 이미 Why does Hyper-threading get reported as supported on processors without it?이라고 대답했습니다. 요컨대, 레거시 비트는 하이퍼 스레딩 또는 멀티 코어 기술을 통해 프로세서 패키지가 둘 이상의 논리 프로세서를 지원하는지 알려줍니다. 비트의 이름은 오해의 소지가 있습니다.

또한 "CPUID를 사용하여 CPU 토폴로지, 안정적인 솔루션을 감지하기 위해 CPUID를 사용 하시겠습니까?"라는 질문을 변경하는 것이 좋습니다. 내가 실수로 당신의 질문을 찾았 기 때문에. 나는 당신의 질문을 발견했을 때 Google에서 Sandy Bridge cpuid 덤프를 찾고있었습니다.

관련 문제