div命令のトレースを表示させてみると、Issue後に時間がかかっているのではなくて、Dispatchをずっと待っているような状態に見えている。
divのレイテンシ計算部分、これがgetInstructionLatency(68) = 1
になっているのがそもそもおかしい。
disassembly : div a4, a5, a0 instruction_decoder_wlib.cc::InstructionDecoder::decode() called totalMicroOps = numLoads + numExecs + numStores = 1 = 0 + 1 + 0 CoreModelBoomV1::getInstructionLatency(68) = 1
これ、divをのぞいたら元に戻るかな?
divのレイテンシの情報は正しく伝わっているらしい。
これはよく見たら別のところで設定されているのか。
common/performance_model/performance_models/core_model/core_model_boom_v1.cc
unsigned int CoreModelBoomV1::getAluLatency(const MicroOp *uop) const { switch(uop->getInstructionOpcode()) { case rv_op_div: case rv_op_divu: case rv_op_rem: case rv_op_remu: case rv_op_divw: case rv_op_divuw: case rv_op_remw: case rv_op_remuw: case rv_op_divd: case rv_op_divud: case rv_op_remd: case rv_op_remud: case rv_op_fdiv_s: case rv_op_fdiv_d: case rv_op_fdiv_q: return 32; // TODO: Latency of div operations need to be more accurately determined default: return getInstructionLatency(uop); //LOG_PRINT_ERROR("Don't know the ALU latency for this MicroOp."); }
最終的にはパイプライン的にはこのようになり、32サイクルのdiv命令が次々と伝搬しているのが分かる。