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
とりあえず使えるようになりましたが、何を調べたら良いんでしょうか。。。