Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Как узнать размер L3 кэша AMD/Intel

#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; }

Комментариев нет:

Отправить комментарий