2017-10-09 10 views
0

x2APIC에서 알다시피 xAPIC에서 사용하는 MMIO 대신 MSR을 사용합니다. 하지만 내 테스트에 따르면 MSR 액세스 속도가 MMIO보다 훨씬 느리다는 것을 발견했습니다. 내가 실행 "MSR_vs_MMIO 0"만약 내가 310 주위에 수를 가지고 그리고 난 경우,x2APIC의 MSR 성능

static __inline__ void __loApicWrite 
(
UINT32 * addr, 
UINT32  value 
) 
{ 
__asm__ volatile 
    (
    "movl %1, %0" 
    : "=m" (*(addr)) 
    : "ir" (value) 
    ); 
} 

void MSR_vs_MMIO(int way) 
{ 
unsigned long a; 
unsigned long b; 
int i = 0; 

msrReg = MSR_BASE_ADDRESS + (LOAPIC_ESR >> 4); 

if (way == 0) /*MSR*/ 
    { 
    for (i = 0; i < 1000; i++) 
     { 
     a = pentiumTscGet();  

     __asm__ volatile 
     (
     "wrmsr\n" 
     : : "c" (msrReg), "a"(0), "d" (0) 
     ); 

     b = pentiumTscGet(); 

     if (b > a) 
      benchmark_record[i] = b - a ; 
     } 
    } 

else   /*MMIO*/ 
    { 
    for (i = 0; i < 1000; i++) 
     { 
     a = pentiumTscGet(); 

     __loApicWrite((UINT32 *)((0x82244000) + LOAPIC_ESR), 0); 
     b = pentiumTscGet(); 

     if (b > a) 
      benchmark_record[i] = b - a ; 
     } 
    } 

return; 

}

:

예를 들어, 내 환경에서 나는 다음과 같이 간단한 테스트 케이스를 작성 "MSR_vs_MMIO 1"을 실행하면 약 40의 번호가 나타납니다.

내 시스템에서 x2APIC이 활성화 및 비활성화되어있는 상태에서 테스트를 수행합니다. 활성화 된 x2APIC으로 시스템을 부팅 할 때 "MSR_vs_MMIO 0"테스트를 실행하고 x2APIC이 비활성화 된 상태에서 시스템을 부팅 할 때 "MSR_vs_MMIO 1"테스트를 실행합니다. 그런 다음 데이터를 수집하고 성능이 매우 다르다는 것을 알게됩니다.

MMIO는 MSR 액세스보다 약 8 배 빠릅니다.

예상대로입니까? 그리고 x2APIC의 MSR과 xAPIC의 MMIO의 성능 차이를 설명하기 위해 인텔 설명서 (필자는 검색했지만 대답이 없습니다)에 관한 문서가 있습니까?

감사합니다.

+1

아마도 타이밍과 관련이 없지만 인라인 asm이 깨졌습니다.) _ "WRMSR 명령어가 직렬화 명령어입니다."_ (명령어 세트 참조 설명서에서 인용) :) – Jester

+0

감사합니다. 재 스터, 깨진 인라인 ASM을 알려주시겠습니까? – lullaby2005

+0

당신은 컴파일러에게 알리지 않고'eax'와'edx'를 0으로 만들고, 더 쉽게는 "a"(0), "d"(0)'로 입력을 전달하고'movl 's. – Jester

답변

0

시스템이 x2apic 모드로 부팅된다고 가정하면 APIC에 대한 MMIO 인터페이스가 비활성화되므로 MMIO 코드가 실제로 APIC에 액세스하지 않습니다. 인텔 SDM 섹션 10.12.2를 참조하십시오.

+0

의견을 보내 주셔서 감사합니다. 사실 x2APIC이 활성화되고 비활성화 된 상태에서 내 시스템에서 테스트를 수행합니다. 활성화 된 x2APIC으로 시스템을 부팅 할 때 "MSR_vs_MMIO 0"테스트를 실행하고 x2APIC이 비활성화 된 상태에서 시스템을 부팅 할 때 "MSR_vs_MMIO 1"테스트를 실행합니다. 그런 다음 데이터를 수집하고 성능이 매우 다르다는 것을 알게됩니다. – lullaby2005

+0

오케이. 당신은 당신의 질문에서 당신이 두 가지 시험 사이에 재부팅해야한다고 말해야합니다. – prl

+0

죄송합니다, 형편 없음. 나는 그것을 새롭게 할 것이다. – lullaby2005