【发布时间】:2016-08-15 06:08:57
【问题描述】:
我在获取 Intel 处理器上的 L3 缓存信息时遇到了问题。在 AMD 上获取 L3 行长度很简单,如下所示:
mov eax, 0x80000006
cpuid
shl edx, 24
shr edx, 24
Intels 上的相同操作要复杂得多。 我知道这可以使用这个序列来完成:
mov eax, 2
cpuid
并通过本手册解析寄存器值:http://www.microbe.cz/docs/CPUID.pdf(第 26 页,“表 2-7。描述符解码值”)。
但我的程序没有找到任何枚举描述符,并为缓存大小和行长度返回 0。
有没有更简单和/或足够的方法来获取 Intel 上的缓存大小和行长?
这是完整的代码。所有 cpuid 输出(eax、ebx、ecx、edx)都被压入堆栈,然后将每个值与硬编码的描述符列表进行比较。比较低 8 位,然后缩小这些位。
__declspec(dllexport) __declspec(naked) void GetMetricLevel2(int &length) {
__asm {
// check CPUID availability
pushfd
pop eax
mov ebx, eax
xor eax, 00200000h
push eax
popfd
pushfd
pop eax
cmp eax, ebx
jnz HAS_CPUID
mov edx, -1 // return -1 by reference
jmp RET_ARG
HAS_CPUID:
mov eax, 2 // L3 Intel, incomplete
mov ecx, 0
cpuid
push ecx
or ecx, eax
or ecx, ebx
or ecx, edx
cmp ecx, 0
pop ecx // experimental
je CPU_AMD // if all registers are 0, we try AMD scheme
CPU_INTEL:
push ebp
mov ebp, 0
push 0
push eax // store counter
jmp CALL_BEGIN
CYCLE_BEGIN:
pop ecx
inc ecx
push ecx
push eax
mov eax, 2
cpuid
CALL_BEGIN:
push eax
push ebx
push ecx
push edx
mov ch, 4
PARSE_REG:
pop edx
mov cl, 4
PARSE_DESCR:
DD0H://512,4w
cmp dl, 0xD0
jne DD1H
add ebp, 512d
jmp MISS_L3CACHE
DD1H://1024,4w
cmp dl, 0xD1
jne DD2H
add ebp, 1024d
jmp MISS_L3CACHE
DD2H://2048,4w
cmp dl, 0xD2
jne DD6H
add ebp, 2048d
jmp MISS_L3CACHE
DD6H://1024,8w
cmp dl, 0xD6
jne DD7H
add ebp, 1024d
jmp MISS_L3CACHE
DD7H://2048,8w
cmp dl, 0xD7
jne DD8H
add ebp, 2048d
jmp MISS_L3CACHE
DD8H://4096,8w
cmp dl, 0xD8
jne DDCH
add ebp, 4096d
jmp MISS_L3CACHE
DDCH://1536,12w
cmp dl, 0xDC
jne DDDH
add ebp, 1536d
jmp MISS_L3CACHE
DDDH://3072,12w
cmp dl, 0xDD
jne DDEH
add ebp, 3072d
jmp MISS_L3CACHE
DDEH://6144,12w
cmp dl, 0xDE
jne DE2H
add ebp, 6144d
jmp MISS_L3CACHE
DE2H://2048,16w
cmp dl, 0xE2
jne DE3H
add ebp, 2048d
jmp MISS_L3CACHE
DE3H://4096,16w
cmp dl, 0xE3
jne DE4H
add ebp, 4096d
jmp MISS_L3CACHE
DE4H://8192,16w
cmp dl, 0xE4
jne DEAH
add ebp, 8192d
jmp MISS_L3CACHE
DEAH://12mb,24w
cmp dl, 0xEA
jne DEBH
add ebp, 12288d
jmp MISS_L3CACHE
DEBH://18mb,24w
cmp dl, 0xEB
jne DECH
add ebp, 18432d
jmp MISS_L3CACHE
DECH://24mb,24w
cmp dl, 0xEC
jne MISS_L3CACHE
add ebp, 24576d
MISS_L3CACHE:
dec cl
cmp cl, 0
shr edx, 8 // it's 8-bit descriptor
jne PARSE_DESCR
dec ch
cmp ch, 0
jne PARSE_REG
CALL_FINISH:
pop eax
cmp al, 0
je CYCLE_FINISH // replace to je then
dec al
jmp CYCLE_BEGIN
CYCLE_FINISH:
mov edx, ebp
shl edx, 8 // 8 bits for cache string length
mov dl, 64d // Intel always has 64 byte L3 string
add esp, 4
pop ebp
jmp RET_ARG
CPU_AMD:
mov eax, 0x80000006 // L3 AMD
cpuid
shl edx, 24
shr edx, 24
RET_ARG:
mov eax, [esp+4] // first argument lies here
mov [eax], edx // return by reference
ret
}
}
【问题讨论】:
-
shl edx, 24; shr edx, 24为什么不用and edx, 0FFh?
标签: caching assembly x86 cpu-cache