pmc始めました

AtherosのSOCのパフォーマンスがMediaTekのSOCに比べて非常に悪いので、いろいろ調べています。

AtherosのSOCではMediaTekのSOCに比べてmrubyのfib(32)の実行時間が同程度のクロックで倍以上になります。

Atherosはビッグエンディアンで、MediaTekなどはリトルエンディアンなのでエンディアンが関係しているのかと思ったのですが、勘違いのような気がしてきています。

FreeBSDにはPerformance Monitoring Countersという仕組みがあり、CPU毎にサポートコードがありMIPSもサポートされているようなので試してみる事にしました。

MIPS24Kの場合hwpmc_mips24kというカーネルモジュールとpmccontrol,pmcstatというコマンドが用意されているようです。

```
# kldload hwpmc_mips24k
hwpmc: SOFT/16/64/0x67<INT,USR,SYS,REA,WRI> MIPS24K/2/32/0x1ff<INT,USR,SYS,EDG,T
HR,REA,WRI,INV,QUA>
# pmccontrol -L
SOFT
        LOCK.FAILED
        CLOCK.PROF
        CLOCK.STAT
        CLOCK.HARD
MIPS24K
        CYCLE
        INSTR_EXECUTED
        BRANCH_COMPLETED
        BRANCH_MISPRED
        RETURN
        RETURN_MISPRED
        RETURN_NOT_31
        RETURN_NOTPRED
        ITLB_ACCESS
        ITLB_MISS
        DTLB_ACCESS
        DTLB_MISS
        JTLB_IACCESS
        JTLB_IMISS
        JTLB_DACCESS
        JTLB_DMISS
        IC_FETCH
        IC_MISS
        DC_LOADSTORE
        DC_WRITEBACK
        DC_MISS
        STORE_MISS
        LOAD_MISS
        INTEGER_COMPLETED
        FP_COMPLETED
        LOAD_COMPLETED
        STORE_COMPLETED
        BARRIER_COMPLETED
        MIPS16_COMPLETED
        NOP_COMPLETED
        INTEGER_MULDIV_COMPLETED
        RF_STALL
        INSTR_REFETCH
        STORE_COND_COMPLETED
        STORE_COND_FAILED
        ICACHE_REQUESTS
        ICACHE_HIT
        L2_WRITEBACK
        L2_ACCESS
        L2_MISS
        L2_ERR_CORRECTED
        EXCEPTIONS
        RF_CYCLES_STALLED
        IFU_CYCLES_STALLED
        ALU_CYCLES_STALLED
        UNCACHED_LOAD
        UNCACHED_STORE
        CP2_REG_TO_REG_COMPLETED
        MFTC_COMPLETED
        IC_BLOCKED_CYCLES
        DC_BLOCKED_CYCLES
        L2_IMISS_STALL_CYCLES
        L2_DMISS_STALL_CYCLES
        DMISS_CYCLES
        L2_MISS_CYCLES
        UNCACHED_BLOCK_CYCLES
        MDU_STALL_CYCLES
        FPU_STALL_CYCLES
        CP2_STALL_CYCLES
        COREXTEND_STALL_CYCLES
        ISPRAM_STALL_CYCLES
        DSPRAM_STALL_CYCLES
        CACHE_STALL_CYCLES
        LOAD_TO_USE_STALLS
        BASE_MISPRED_STALLS
        CPO_READ_STALLS
        BRANCH_MISPRED_CYCLES
        IFETCH_BUFFER_FULL
        FETCH_BUFFER_ALLOCATED
        EJTAG_ITRIGGER
        EJTAG_DTRIGGER
        FSB_LT_QUARTER
        FSB_QUARTER_TO_HALF
        FSB_GT_HALF
        FSB_FULL_PIPELINE_STALLS
        LDQ_LT_QUARTER
        LDQ_QUARTER_TO_HALF
        LDQ_GT_HALF
        LDQ_FULL_PIPELINE_STALLS
        WBB_LT_QUARTER
        WBB_QUARTER_TO_HALF
        WBB_GT_HALF
        WBB_FULL_PIPELINE_STALLS
        REQUEST_LATENCY
        REQUEST_COUNT
```
pmcstatにはカーネルイメージが必要なので、Flashに入らない場合は、USBストレージにでもコピーしておきます。/mntにkernelをコピーして下記を実行してみました。

```
# pmcstat -S instructions -T -k /mnt
```

topコマンドのように以下のような表示が定期的に更新されます。

```
PMC: [INSTR_EXECUTED] Samples: 580 (100.0%) , 294 unresolved

%SAMP IMAGE      FUNCTION             CALLERS
  9.8 libc.so.7  qsort
  6.6 libc.so.7  malloc
  5.6 libc.so.7  ffs
  5.2 libelf.so. gelf_getsym
  4.5 pmcstat    pmcstat_string_looku
  4.2 libelf.so. elf_strptr
  3.1 ld-elf.so. 0x126c
  2.4 libelf.so. elf_getscn
  1.7 libpmc.so. pmclog_read
  1.4 libelf.so. elf_getdata
  1.4 libc.so.7  bcopy
  1.4 libc.so.7  strdup
  1.4 libc.so.7  memcpy
  1.4 pmcstat    0x6770
  1.4 pmcstat    pmcstat_string_inter
  1.0 libc.so.7  strchr
  1.0 libc.so.7  strlen
  1.0 pmcstat    0x6730
  1.0 pmcstat    0x6724
  1.0 pmcstat    0x6740
  1.0 pmcstat    0x6734
```

とりあえず使えるようになりましたが、何を調べたら良いんでしょうか。。。