2015-06-06 5 views
3

По карапуз он BKDG от AMD 15h (стр 588), то possbile отключить аппаратную предвыборки, установив некоторые биты MSRC001_1022Perf статистика по AMD 15h

MSRC001_1022 Data Cache Configuration (DC_CFG) 
Bits --> Description 
63:16 --> Reserved. 
15  --> DisPfHwForSw. Read-write. Reset: 0. 1=Disable hardware prefetches for software prefetches. 
14  --> Reserved. 
13  --> DisHwPf. Read-write. Reset: 0. 1=Disable the DC hardware prefetcher. 
12:10 --> Reserved. 
9:5  --> Reserved. 
4  --> DisSpecTlbRld. Read-write. Reset: 0. 1=Disable speculative TLB reloads. 
3:0  --> Reserved. 

Для того, чтобы отключить все предварительной выборки конфиги, Я должен написать 0xA008 до , что MSR. Я сделал это для всех 32 ядер с помощью

[root <at> tiger exe]# wrmsr -a 0xc0011022 0xA008 
[root <at> tiger exe]# rdmsr -a -x -0 0xc0011022 
000000000000a008 
... 

Однако, когда я бег перфорации вместе с командой, статистика предвыборки отличен от нуля!

[root <at> tiger exe]# perf stat -e 
L1-dcache-loads:uk,L1-dcache-prefetches:uk,L1-dcache-prefetch-misses:uk ./bzip2_base.amd64-m64-gcc44-nn 
spec_init 
Tested 64MB buffer: OK! 
Performance counter stats for './bzip2_base.amd64-m64-gcc44-nn': 
    55,341,597,193 L1-dcache-loads:uk 
    1,047,662,614 L1-dcache-prefetches:uk 
       0 L1-dcache-prefetch-misses:uk 
     35.921618464 seconds time elapsed 

Ожидаю увидеть 0 перед L1-dcache-prefetches. Не так ли?

Как я могу отлаживать счетчики, чтобы узнать, как они сопоставлены с MSR?

+0

счетчики отладки с '-V' или' -vvv' [опции перманентной записи] (http://man7.org/linux/man-pages/man1/perf-record.1.html), некоторые из них распечатывают все аргументы, используемые в вызове 'perf_event_open'. Они могут быть синтетическими, поэтому проверьте часть ядра 'perf_events' (какая у вас версия ядра?) - они находятся в [' arch/x86/events/amd/core.c'] (http: //elixir.free- electron.com/linux/v4.8/source/arch/x86/events/amd/core.c): L1D OP_PREFETCH RESULT_ACCESS = '0x0267,/* Prefetcher данных: попытки загрузки * /' и l1-dcache равны '0x0040,/* Доступ к кэшу данных */' – osgx

ответ

0

Сопоставление синтетических имен перфораторов для счетчиков hw (перечислено perf list) определено внутри источников ядра подсистемы perf_events для многих процессоров. Для amd они находятся в файле arch/x86/events/amd/core.c. В 4.8 версии ядра и AMD кэш процессора событий отображаются на центральный процессор конкретных констант должны быть записаны в ПМЦ MSRS как:

http://elixir.free-electrons.com/linux/v4.8/source/arch/x86/events/amd/core.c

static __initconst const u64 amd_hw_cache_event_ids 
... = { 
[ C(L1D) ] = { 
    [ C(OP_READ) ] = { 
     [ C(RESULT_ACCESS) ] = 0x0040, /* Data Cache Accesses  */ 
     [ C(RESULT_MISS) ] = 0x0141, /* Data Cache Misses   */ 
    }, 
    [ C(OP_WRITE) ] = { 
     [ C(RESULT_ACCESS) ] = 0, 
     [ C(RESULT_MISS) ] = 0, 
    }, 
    [ C(OP_PREFETCH) ] = { 
     [ C(RESULT_ACCESS) ] = 0x0267, /* Data Prefetcher :attempts */ 
     [ C(RESULT_MISS) ] = 0x0167, /* Data Prefetcher :cancelled */ 
    }, 
}, 
[ C(L1I) ] = { 
    [ C(OP_READ) ] = { 
     [ C(RESULT_ACCESS) ] = 0x0080, /* Instruction cache fetches */ 
     [ C(RESULT_MISS) ] = 0x0081, /* Instruction cache misses */ 
    }, 
    [ C(OP_WRITE) ] = { 
     [ C(RESULT_ACCESS) ] = -1, 
     [ C(RESULT_MISS) ] = -1, 
    }, 
    [ C(OP_PREFETCH) ] = { 
     [ C(RESULT_ACCESS) ] = 0x014B, /* Prefetch Instructions :Load */ 
     [ C(RESULT_MISS) ] = 0, 
    }, 
}, 
[ C(LL ) ] = { 
    [ C(OP_READ) ] = { 
     [ C(RESULT_ACCESS) ] = 0x037D, /* Requests to L2 Cache :IC+DC */ 
     [ C(RESULT_MISS) ] = 0x037E, /* L2 Cache Misses : IC+DC  */ 
    }, 
    [ C(OP_WRITE) ] = { 
     [ C(RESULT_ACCESS) ] = 0x017F, /* L2 Fill/Writeback   */ 
     [ C(RESULT_MISS) ] = 0, 
    }, 
    [ C(OP_PREFETCH) ] = { 
     [ C(RESULT_ACCESS) ] = 0, 
     [ C(RESULT_MISS) ] = 0, 
    }, 
}, 

... 
__init int amd_pmu_init(void) 
{ ... 
    /* Performance-monitoring supported from K7 and later: */ 
    if (boot_cpu_data.x86 < 6) 
     return -ENODEV; 

    x86_pmu = amd_pmu; 

    ret = amd_core_pmu_init(); 
    ... 

    /* Events are common for all AMDs */ 
    memcpy(hw_cache_event_ids, amd_hw_cache_event_ids, 
      sizeof(hw_cache_event_ids)); 
    return 0; 
}