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의 성능 차이를 설명하기 위해 인텔 설명서 (필자는 검색했지만 대답이 없습니다)에 관한 문서가 있습니까?
감사합니다.
아마도 타이밍과 관련이 없지만 인라인 asm이 깨졌습니다.) _ "WRMSR 명령어가 직렬화 명령어입니다."_ (명령어 세트 참조 설명서에서 인용) :) – Jester
감사합니다. 재 스터, 깨진 인라인 ASM을 알려주시겠습니까? – lullaby2005
당신은 컴파일러에게 알리지 않고'eax'와'edx'를 0으로 만들고, 더 쉽게는 "a"(0), "d"(0)'로 입력을 전달하고'movl 's. – Jester