2011-12-19 8 views
5

취미 OS의 CPU 감지 및 일반 환경 감지 코드 작업 중입니다. CPUID를 여러 번 호출해야하는 경우가 있습니까? 즉, 시스템에 여러 개의 코어가있는 경우 각 코어에서 CPUID를 호출해야합니까? NUMA와 동일합니다.다중 코어의 CPUID/NUMA

AMDIntel CPUID 설명서는이 점에서 분명하지 않습니다. osdev 위키에서 호출하는 CPUID가 Detecting CPU Topology이라고 언급되어 있지만, CPUID를 호출해야하는 횟수와 횟수에 대한 정보가 명확하지 않았습니다.

+0

CPUID가 비정상적으로 작용할 수있는 상황 중 하나가 동일한 칩에 CPU와 GPU가 모두 포함 된 AMD Fusion이라고 가정합니다. 자세한 내용은 설명서를 살펴 봐야합니다. 그 외에는 내부 CPU 코어가 다른 코어와 다른 CPUID를 표시하는 이유를 알지 못합니다. – Polynomial

+0

주어진 답변 외에 CPUID를 여러 번 호출하는 또 다른 이유는 성능 측정을 위해 rdtsc 명령을 사용할 때입니다. 일반적으로 cpuid가 '직렬화'명령이고 파이프 라이닝을 방지하기 때문에 cpuid를 사용하기 전에 cpuid를 사용합니다. 그러나 cpuid는 (rdtsc의 이전 인텔 매뉴얼에 따라) 호출 된 처음 몇 번 실행하는 데 오랜 시간이 걸릴 수 있습니다. 시작할 때 몇 번 호출하여 속도가 빨라 졌는지 확인한 다음 모든 rdtsc 호출 전에 사용하십시오. –

답변

3

거의 일주일이 지났으며 아무도이 질문에 답할 수 없었기 때문에 (어쩌면 공휴일로 인해) 어쨌든이 질문에 답변하려고합니다.

나는 대답이 '예'라고 생각합니다. 각 코어에서 CPUID으로 전화해야 할 수도 있습니다. 이것의 한 가지 이유는 오늘날 모든 시스템 (심지어 심지어 x86)이 동질성이 아니라는 것입니다.

예를 들어 일부 이중 소켓 서버 보드에 프로세서 모델을 두 개 혼합하여 사용할 수 있다는 오버 클럭킹 포럼 (링크를 찾을 수 없음)을 읽었습니다. 그 사람은 두개의 다른 속도 프로세서를 가진 듀얼 소켓 1366 시스템을 가지고있었습니다.

이 경우, CPUID을 호출하는 것은 스레드가 있던 프로세서에 따라 달라 지므로 모든 정보를 얻기 위해 각 프로세서마다 호출해야합니다.

내 서버 - 마더 보드 중 하나의 매뉴얼에는 다른 모델의 프로세서를 특정 제약 조건으로 혼합 할 수 있다는 내용도 나와 있습니다. 그리고 분명히 동일한 프로세서 모델의 두 가지 다른 steppings을 섞어서 사용할 수 있습니다.


이 혼자 이유 (이종 토폴로지), 각각의 코어에 CPUID를 호출해야하는 이유는 이미.

+0

오랜 시간 동안 답변을 드려 죄송합니다. 예, 맞습니다. 다이의 각 CPU는 CPUID 정보를 추출하여 저장해야합니다. – nixeagle

+0

다른 명령어 세트를 가진 모든 CPU의 모든 코어에서 CPUID를 성공적으로 호출하면 어떻게됩니까? 즉 하나의 CPU에는 SSSE3이 있고 다른 SSSE4.2가 있습니다. 그런 다음이 정보를 사용하여 SSE4.2 지침을 사용하는 코드를 입력하십시오. 이 코드를 실행하는 도중에 OS가 스레드를 스왑 아웃 한 다음 SSSE3까지만 지원하는 CPU에 예약됩니다. 그런 다음 SSE4.1 명령을 실행하면 코드가 충돌합니다. 따라서 여러 코어에서 CPUID를 호출하는 것만으로는 충분하지 않습니다. 그렇게 한 후에도 스레드 선호도를 설정해야합니다. 이 올바른지? – Apriori

+0

@Apriori 그럴 가능성은 희박합니다. Intel 또는 AMD x86 구성이 하나만 있어도 다른 명령 세트를 사용하여 다른 세대의 CPU를 설치할 수 있다는 것을 알고 있습니다. 그러나 과도하게 조심하고 싶다면, 그렇게 할 수 있습니다. 나는 그것이 과잉이라고 생각한다. – Mysticial