Gabriel B. has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/67674?usp=email )

Change subject: mem-ruby: Optimize MachineType_base_number calculation
......................................................................

mem-ruby: Optimize MachineType_base_number calculation

Values returned by MachineType_base_number can be computed once and
for all after ellaboration. Thus, they are stored in local static
variables and the initialization logic is guarded by a once-flag. The
function is now a simple switch during subsequent calls.

Change-Id: If93628851322566e58015c16267093640f526926
---
M src/mem/slicc/symbols/Type.py
1 file changed, 47 insertions(+), 26 deletions(-)



diff --git a/src/mem/slicc/symbols/Type.py b/src/mem/slicc/symbols/Type.py
index a8735a7..a0bcd7b 100644
--- a/src/mem/slicc/symbols/Type.py
+++ b/src/mem/slicc/symbols/Type.py
@@ -863,35 +863,42 @@
  */
 int
 ${{self.c_ident}}_base_number(const ${{self.c_ident}}& obj)
-{
-    int base = 0;
-    switch(obj) {
-"""
-            )
-
-            # For each field
+{""")
+            ev = list(self.enums.values())
             code.indent()
-            code("  case ${{self.c_ident}}_NUM:")
-            for enum in reversed(list(self.enums.values())):
-                # Check if there is a defined machine with this type
-                if enum.primary:
-                    code(
- " base += ${{enum.ident}}_Controller::getNumControllers();"
-                    )
-                else:
-                    code("    base += 0;")
-                code("    [[fallthrough]];")
-                code("  case ${{self.c_ident}}_${{enum.ident}}:")
-            code("    break;")
+ # Caching hack. Controller instance counts are global and constant
+            # anyway so why not abusing that by caching all values here ?
+ # Caching is usefull as this function is called frequently during a
+            # simulation (especially for MachineType).
+            code("static bool initialized{false};")
+            for e in ev:
+                code("static int ${{self.c_ident}}_${{e.ident}}_base;")
+            code("if (GEM5_UNLIKELY(!initialized)) {")
+            code.indent()
+            code("initialized = true;")
+            for e0, e1 in zip(ev[:-1], ev[1:]):
+                code("${{self.c_ident}}_${{e1.ident}}_base = ")
+                code.indent()
+                code("${{self.c_ident}}_${{e0.ident}}_base +")
+                code("AbstractController::controllerCount("
+                        "${{self.c_ident}}_${{e0.ident}});")
+                code.dedent()
             code.dedent()
+            code("}")

-            code(
-                """
-      default:
-        panic("Invalid range for type ${{self.c_ident}}");
-    }
-
-    return base;
+            code("switch(obj) {")
+            code.indent()
+            for enum in self.enums.values():
+                code("case ${{self.c_ident}}_${{enum.ident}}: "
+                        "  return ${{self.c_ident}}_${{enum.ident}}_base;")
+            code("case ${{self.c_ident}}_NUM: "
+                 "return ${{self.c_ident}}_${{ev[-1].ident}}_base;")
+ code('default: panic("Invalid range for type ${{self.c_ident}}:"'
+                 '" %d", int(obj));')
+            code.dedent()
+            code("}")
+            code.dedent()
+            code("""
 }

 /** \\brief returns the total number of components for each machine

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/67674?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: If93628851322566e58015c16267093640f526926
Gerrit-Change-Number: 67674
Gerrit-PatchSet: 1
Gerrit-Owner: Gabriel B. <gabriel.bus...@arteris.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to