Skip to content

Commit d423186

Browse files
authored
PerfCnt: count and sum for each DiffState when Batch (#560)
Previous we will only show v_difftest_Batch when enable Batch. This change will also show nums and bytes of every DifftestBundle, which will help find out key DiffState affecting DPIC performance.
1 parent 199cfee commit d423186

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

src/main/scala/DPIC.scala

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,14 @@ class DPICBatch(template: Seq[DifftestBundle], batchIO: BatchIO, config: Gateway
224224
override def dpicFuncAssigns: Seq[String] = {
225225
val bundleEnum = template.map(_.desiredModuleName.replace("Difftest", "")) ++ Seq("BatchInterval", "BatchFinish")
226226
val bundleAssign = template.zipWithIndex.map { case (t, idx) =>
227+
val bundleName = bundleEnum(idx)
228+
val perfName = "perf_Batch_" + bundleName
227229
s"""
228-
| else if (id == ${bundleEnum(idx)}) {
230+
| else if (id == $bundleName) {
231+
|#ifdef CONFIG_DIFFTEST_PERFCNT
232+
| dpic_calls[$perfName] += num;
233+
| dpic_bytes[$perfName] += num * ${t.getByteAlignWidth / 8};
234+
|#endif // CONFIG_DIFFTEST_PERFCNT
229235
| for (int j = 0; j < num; j++) {
230236
| ${getDPICBundleUnpack(t)}
231237
| }
@@ -312,6 +318,7 @@ private class DummyDPICBatchWrapper(
312318

313319
object DPIC {
314320
val interfaces = ListBuffer.empty[(String, String, String)]
321+
private val perfs = ListBuffer.empty[String]
315322

316323
def apply(control: GatewaySinkControl, io: Valid[DifftestBundle], config: GatewayConfig): Unit = {
317324
val bundleType = chiselTypeOf(io)
@@ -321,6 +328,7 @@ object DPIC {
321328
module.io := io
322329
val dpic = module.dpic
323330
if (!interfaces.map(_._1).contains(dpic.dpicFuncName)) {
331+
perfs += dpic.dpicFuncName
324332
val interface = (dpic.dpicFuncName, dpic.dpicFuncProto, dpic.dpicFunc)
325333
interfaces += interface
326334
}
@@ -333,6 +341,8 @@ object DPIC {
333341
module.io := io
334342
val dpic = module.dpic
335343
interfaces += ((dpic.dpicFuncName, dpic.dpicFuncProto, dpic.dpicFunc))
344+
perfs += dpic.dpicFuncName
345+
perfs ++= template.map("Batch_" + _.desiredModuleName.replace("Difftest", ""))
336346
}
337347

338348
def collect(): GatewayResult = {
@@ -388,7 +398,7 @@ object DPIC {
388398
s"""
389399
|#ifdef CONFIG_DIFFTEST_PERFCNT
390400
|enum DIFFSTATE_PERF {
391-
| ${(interfaces.map("perf_" + _._1) ++ Seq("DIFFSTATE_PERF_NUM")).mkString(",\n ")}
401+
| ${(perfs.toSeq.map("perf_" + _) ++ Seq("DIFFSTATE_PERF_NUM")).mkString(",\n ")}
392402
|};
393403
|long long dpic_calls[DIFFSTATE_PERF_NUM] = {0}, dpic_bytes[DIFFSTATE_PERF_NUM] = {0};
394404
|#endif // CONFIG_DIFFTEST_PERFCNT
@@ -426,6 +436,7 @@ object DPIC {
426436
| diffstate_buffer = nullptr;
427437
|}
428438
""".stripMargin
439+
val diffstate_perfhead = if (perfs.head.contains("Batch")) 1 else 0
429440
interfaceCpp +=
430441
s"""
431442
|#ifdef CONFIG_DIFFTEST_PERFCNT
@@ -438,12 +449,14 @@ object DPIC {
438449
|void diffstate_perfcnt_finish(long long msec) {
439450
| long long calls_sum = 0, bytes_sum = 0;
440451
| const char *dpic_name[DIFFSTATE_PERF_NUM] = {
441-
| ${interfaces.map("\"" + _._1 + "\"").mkString(",\n ")}
452+
| ${perfs.map("\"" + _ + "\"").mkString(",\n ")}
442453
| };
443454
| for (int i = 0; i < DIFFSTATE_PERF_NUM; i++) {
455+
| difftest_perfcnt_print(dpic_name[i], dpic_calls[i], dpic_bytes[i], msec);
456+
| }
457+
| for (int i = ${diffstate_perfhead}; i < DIFFSTATE_PERF_NUM; i++) {
444458
| calls_sum += dpic_calls[i];
445459
| bytes_sum += dpic_bytes[i];
446-
| difftest_perfcnt_print(dpic_name[i], dpic_calls[i], dpic_bytes[i], msec);
447460
| }
448461
| difftest_perfcnt_print(\"DIFFSTATE_SUM\", calls_sum, bytes_sum, msec);
449462
|}

0 commit comments

Comments
 (0)