Hmmer
perf 结果
78.37% hmmer_base.x86- hmmer_base.x86-gcc11.4.0-o3 [.] Viterbi* ◆
8.31% hmmer_base.x86- hmmer_base.x86-gcc11.4.0-o3 [.] FChoose ▒
7.57% hmmer_base.x86- hmmer_base.x86-gcc11.4.0-o3 [.] sre_random
核心循环
P7Viterbi()
for (k = 1; k <= M; k++) {
mc[k] = mpp[k-1] + tpmm[k-1];
if ((sc = ip[k-1] + tpim[k-1]) > mc[k]) mc[k] = sc;
if ((sc = dpp[k-1] + tpdm[k-1]) > mc[k]) mc[k] = sc;
if ((sc = xmb + bp[k]) > mc[k]) mc[k] = sc;
mc[k] += ms[k];
if (mc[k] < -INFTY) mc[k] = -INFTY;
dc[k] = dc[k-1] + tpdd[k-1];
if ((sc = mc[k-1] + tpmd[k-1]) > dc[k]) dc[k] = sc;
if (dc[k] < -INFTY) dc[k] = -INFTY;
if (k < M) {
ic[k] = mpp[k] + tpmi[k];
if ((sc = ip[k] + tpii[k]) > ic[k]) ic[k] = sc;
ic[k] += is[k];
if (ic[k] < -INFTY) ic[k] = -INFTY;
}
}
有很多if 条件判断,很像谓词逻辑,参考
如果什么都不加,编译出来很多mov, cmp 指令
如果加上B 扩展,就会生成好很多吧
zba, zbb, zbc, zbs 具体哪一个影响大呢?
或许可以用qemu 跑分来试试,看看运行时间因该能看出来
qemu 套着跑hmmer test
-march = gcb time = 5.7s, insts = 116,721,122,501
-march = gc time = 9.3s, insts = 168,642,744,640
用qemu plugins tbstat.so
gcb: insts = 18*10^9
gc: insts = 20*10^9
gcb 中出现大量max 指令 大约有1.3*10^9, 占比5%了,还是挺高的!
说明if (mc[k] < -INFTY) mc[k] = -INFTY; 会编译为 mc[k] = max(mc[k], -INFTY)
根据qemu plugins tbstat.so 统计出来运行test 输入时候的常见指令
注意这里统计的test 输入,切片是使用spec ref 输入,有一定误差,使用test 统计只需要1分钟
这里的程序二进制地址位于/nfs/share/zyy/spec06_rv64gcb_O3_20m_gcc12.2.0-intFpcOff-jeMalloc/elf/hmmer_base.riscv64-linux-gnu-gcc12.2.0
程序输入位于/nfs/home/yanyue/tools/cpu2006v99/benchspec/CPU2006/456.hmmer/data/test/input
运行参数位于/nfs/home/yanyue/tools/CPU2006LiteWrapper/456.hmmer/run-test.sh
qemu-riscv64 -plugin $PLUGINS/libtbstat.so -d plugin ./hmmer_base.riscv64-linux-gnu-gcc12.2.0 --fixed 0 --mean 325 --num 45000 --sd 200 --seed 0 bombesin.hmm
cat top_blocks_with_instructions.txt
Total Dynamic Instructions: 17630787992
Top 10 Most Executed Basic Blocks with Instructions:
Basic Block at 0x1a9e2 executed 159793642 times
Instructions:
0x1a9e2: flw fa4,0(a4)
0x1a9e6: fadd.s dyn,fa5,fa5,fa4
0x1a9ea: flt.s a3,fa0,fa5
0x1a9ee: beqz a3,-20 # 0x1a9da
Basic Block at 0x1a9da executed 144113680 times
Instructions:
0x1a9da: addi a5,a5,1
0x1a9dc: addi a4,a4,4
0x1a9de: beq s5,a5,220 # 0x1aaba
Basic Block at 0x17ee2 executed 141152715 times
Instructions:
0x17ee2: lw t1,0(a2)
0x17ee6: lw a1,0(a0)
0x17ee8: addi a2,a2,4
0x17eea: addi a0,a0,4
0x17eec: addw a1,a1,t1
0x17ef0: max a6,a1,a6
0x17ef4: bne a2,t3,-18 # 0x17ee2
Basic Block at 0x17cdc executed 125469080 times
Instructions:
0x17cdc: ld a2,24(sp)
0x17cde: lw a0,0(s1)
0x17ce0: ld s2,32(sp)
0x17ce2: add a2,a2,a1
0x17ce4: lw a2,0(a2)
0x17ce6: add s2,s2,a1
0x17ce8: add s3,s4,a1
0x17cec: addw a0,a0,a2
0x17cee: sw a0,0(t3)
0x17cf2: lw a2,0(t2)
0x17cf6: lw s5,0(s2)
0x17cfa: ld s2,40(sp)
0x17cfc: addi s1,s1,4
0x17cfe: addw a2,a2,s5
0x17d02: max a2,a2,a0
0x17d06: add s2,s2,a1
0x17d08: sw a2,0(t3)
0x17d0c: lw s5,0(s3)
0x17d10: lw a0,0(s2)
0x17d14: ld s2,64(sp)
0x17d16: addi a6,a6,4
0x17d18: addw a0,a0,s5
0x17d1c: add s3,s2,a1
0x17d20: max a0,a0,a2
0x17d24: sw a0,0(t3)
0x17d28: lw a2,4(s3)
0x17d2c: ld s3,56(sp)
0x17d2e: ld s2,8(sp)
0x17d30: addi t2,t2,4
0x17d32: add s10,s3,a1
0x17d36: ld s3,48(sp)
0x17d38: add s2,s2,a1
0x17d3a: addiw t1,t1,1
0x17d3c: add s5,s3,a1
0x17d40: ld s3,0(sp)
0x17d42: addi t3,t3,4
0x17d44: addi t0,t0,4
0x17d46: addw a2,a2,s3
0x17d4a: max a2,a2,a0
0x17d4e: sw a2,-4(t3)
0x17d52: lw a0,4(s2)
0x17d56: ld s2,112(sp)
0x17d58: addw a0,a0,a2
0x17d5a: max a0,a0,a4
0x17d5e: sw a0,-4(t3)
0x17d62: lw a2,0(s10)
0x17d66: lw a0,-8(t0)
0x17d6a: add s3,s2,a1
0x17d6e: ld s2,120(sp)
0x17d70: addw a0,a0,a2
0x17d72: sw a0,-4(t0)
0x17d76: lw a2,-8(t3)
0x17d7a: lw s5,0(s5)
0x17d7e: add s2,s2,a1
0x17d80: ld s10,16(sp)
0x17d82: addw a2,a2,s5
0x17d86: max a2,a2,a0
0x17d8a: max a2,a2,a4
0x17d8e: sw a2,-4(t0)
0x17d92: lw a2,4(s3)
0x17d96: lw a0,0(s1)
0x17d98: add s10,s10,a1
0x17d9a: addi a1,a1,4
0x17d9c: addw a0,a0,a2
0x17d9e: sw a0,-4(a6)
0x17da2: lw a2,0(t2)
0x17da6: lw s2,4(s2)
0x17daa: addw a2,a2,s2
0x17dae: max a2,a2,a0
0x17db2: sw a2,-4(a6)
0x17db6: lw a0,4(s10)
0x17dba: addw a0,a0,a2
0x17dbc: max a0,a0,a4
0x17dc0: sw a0,-4(a6)
0x17dc4: bne a7,t1,-232 # 0x17cdc
Basic Block at 0x11f96 executed 15745916 times
Instructions:
0x11f96: addi sp,sp,-32
0x11f98: sd s2,8(sp)
0x11f9a: lw a5,-1552(gp)
0x11f9e: sd s0,24(sp)
0x11fa0: sd s1,16(sp)
0x11fa2: blez a5,364 # 0x1210e
Basic Block at 0x1210e executed 15745915 times
Instructions:
0x1210e: ld a5,-1392(gp)
0x12112: ld a4,-1400(gp)
0x12116: addi t6,gp,-1320
0x1211a: j -216 # 0x12042
Basic Block at 0x12042 executed 15745915 times
Instructions:
0x12042: lui a2,13
0x12044: addi a2,a2,420
0x12048: rem a3,a5,a2
0x1204c: div a5,a5,a2
0x12050: lui a2,10
0x12052: addi a2,a2,-946
0x12056: mul a3,a3,a2
0x1205a: lui a2,3
0x1205c: addi a2,a2,-77
0x12060: mul a5,a5,a2
0x12064: sub a3,a3,a5
0x12066: bgez a3,14 # 0x12074
Basic Block at 0x5b82a executed 15683695 times
Instructions:
0x5b82a: andi a5,a0,7
0x5b82e: andi a4,a1,255
0x5b832: bnez a5,14 # 0x5b840
Basic Block at 0x5b88c executed 15683689 times
Instructions:
0x5b88c: lbu a3,-8(a5)
0x5b890: beq a3,a4,-72 # 0x5b848
Basic Block at 0x5b84a executed 15683689 times
Instructions:
0x5b84a: andi a1,a1,255
0x5b84e: slli a5,a1,8
0x5b852: add a5,a5,a1
0x5b854: slli t1,a5,16
0x5b858: add t1,t1,a5
0x5b85a: slli a5,t1,32
0x5b85e: add t1,t1,a5
0x5b860: auipc a6,41 # 0x84860
0x5b864: ld a6,1896(a6)
0x5b868: addi t3,zero,-1
0x5b86a: ld a1,0(a0)
0x5b86c: addi a5,a0,8
0x5b870: xor a7,t1,a1
0x5b874: add a3,a1,a6
0x5b878: add a2,a7,a6
0x5b87c: xor a3,a3,a1
0x5b87e: xor a2,a2,a7
0x5b882: and a3,a3,a2
0x5b884: or a3,a3,a6
0x5b888: beq a3,t3,88 # 0x5b8e0