#cpp #c #ассемблер
Как можно узнать размер кэша L3 на различных процессорах, используя серию вызовов __cpuid(ex)? void __cpuidex(int *regs, int leaf, int attempt) { __asm { mov ecx, attempt mov eax, leaf cpuid mov esi, regs mov [esi], eax mov [esi + 4], ebx mov [esi + 8], ecx mov [esi + 12], edx } }
Ответы
Ответ 1
Могу предложить альтернативный вариант получения L3Cache из SMBIOS (без вызова __cpuid(ex) ): Получить структуру ProcessorInformation, в ней есть поле L3CacheHandle, по которому из структуры CacheInformation можно получить размер кеша. Спецификация SMBIOSОтвет 2
Почему бы не почитать спецификацию? Запрос на "amd cpuid specification" даёт ссылку http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/25481.pdf Зачем читаем L3: CPUID Fn8000_0006_EDX L3 Cache Identifiers bits from:to 31:18 L3Size: L3 cache size. Specifies the L3 cache size is within the following range: (L3Size[31:18] * 512KB) L3 cache size < ((L3Size[31:18]+1) * 512KB). 17:16 reserved 15:12 L3Assoc: L3 cache associativity. L3 cache associativity. See Table 4. 11:8 L3LinesPerTag: L3 cache lines per tag. 7:0 L3LineSize: L3 cache line size in bytes. table4 0h L2/L3 cache or TLB is disabled. 1h Direct mapped. 2h 2-way associative. 4h 4-way associative. 6h 8-way associative. 8h 16-way associative. Ah 32-way associative. Bh 48-way associative. Ch 64-way associative. Dh 96-way associative. Eh 128-way associative. Fh Fully associative По идее что-то такое function getL3Size(){ int regs[4]; __cpuidex(®s,0x8000,6); return (((unsigned long)regs[0]) >> 18) * 512 * 1024; }
Комментариев нет:
Отправить комментарий