IntelプロセッサでL3キャッシュ情報を取得中に問題が発生しました。 AMDのL3行の長さは次のように簡単です。cpuidを使用してIntelプロセッサ上のL3キャッシュ情報(サイズ、行長)を取得する方法は?
mov eax, 0x80000006
cpuid
shl edx, 24
shr edx, 24
Intelsでの同じ操作ははるかに複雑です。 私がこのシーケンスを使用して行われるかもしれないということだ:
mov eax, 2
cpuid
と、このマニュアルでレジスタ値をpasring:http://www.microbe.cz/docs/CPUID.pdf(26ページ、「表2-7記述子デコード値。」)。
私のプログラムは列挙されたディスクリプタを見つけられず、キャッシュのサイズと行の長さは0を返します。
Intelsにキャッシュサイズと行長を取得するための方法はありますか?
ここに完全なコードがあります。すべての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 'とedx、0FFh'を使わないのはなぜですか? –