From 617927d589becfcc3b4e8fbf0cb9947a33869fbf Mon Sep 17 00:00:00 2001
From: Yifan Zhao <yifanz16@illinois.edu>
Date: Mon, 5 Apr 2021 04:02:02 -0500
Subject: [PATCH] PipedBin tuner handles device of knobs

---
 predtuner/pipedbin.py | 40 +++++++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 17 deletions(-)

diff --git a/predtuner/pipedbin.py b/predtuner/pipedbin.py
index b2bdbe5..bfa277c 100644
--- a/predtuner/pipedbin.py
+++ b/predtuner/pipedbin.py
@@ -37,19 +37,16 @@ class PipedBinaryApp(ModeledApp):
         self.base_dir = (
             self.binary_path.parent if base_dir is None else Path(base_dir).absolute()
         )
-        metadata_file = Path(metadata_path)
         self.qos_file = self.base_dir / qos_relpath
-        with metadata_file.open() as f:
-            (
-                self.op_costs,
-                op_knobs,
-                self.knob_speedups,
-                self.baseline_knob,
-                self.tune_labels,
-                self.conf_file,
-                self.fifo_r_file,
-                self.fifo_w_file,
-            ) = self._parse_metadata(json.load(f))
+        (
+            self.op_costs,
+            op_knobs,
+            self.knob_speedup,
+            self.tune_labels,
+            self.conf_file,
+            self.fifo_r_file,
+            self.fifo_w_file,
+        ) = self._read_metadata(metadata_path)
         self._op_order = {v: i for i, v in enumerate(op_knobs.keys())}
         self.model_storage = (
             Path(model_storage_folder) if model_storage_folder else None
@@ -106,7 +103,7 @@ class PipedBinaryApp(ModeledApp):
         p1_storage = self.model_storage / "p1.pkl" if self.model_storage else None
         p2_storage = self.model_storage / "p2.json" if self.model_storage else None
         return [
-            LinearPerfModel(self, self.op_costs, self.knob_speedups),
+            LinearPerfModel(self, self.op_costs, self.knob_speedup),
             QoSModelP1(
                 self,
                 lambda conf: self._run_on_knobs(conf, False)[0],
@@ -162,15 +159,23 @@ class PipedBinaryApp(ModeledApp):
             )
 
     @staticmethod
-    def _parse_metadata(metadata: dict):
+    def _read_metadata(metadata_path: PathLike):
+        metadata_file = Path(metadata_path)
+        with metadata_file.open() as f:
+            metadata = json.load(f)
         op_costs = metadata["op_cost"]
         op_knobs = metadata["op_knobs"]
         knob_speedup = metadata["knob_speedup"]
+        knob_devices = metadata["knob_devices"]
         baseline_knob = metadata["baseline_knob"]
         # Check sanity
         if set(op_costs.keys()) != set(op_knobs.keys()):
             raise ValueError(
-                "Operators listed in layer_cost and knobs_of_layer don't agree"
+                "Operators listed in layer_cost and knobs_of_layer mismatch"
+            )
+        if set(knob_speedup.keys()) != set(knob_devices.keys()):
+            raise ValueError(
+                "Knobs listed in knob_speedup and knob_devices mismatch"
             )
         knobs_used = set().union(*[set(knobs) for knobs in op_knobs.values()])
         knobs_defined = set(knob_speedup.keys())
@@ -183,7 +188,7 @@ class PipedBinaryApp(ModeledApp):
             raise ValueError(f"baseline_knob {baseline_knob} is undefined")
         # Create actual knob object from knob names
         name2knob = {
-            s: ApproxKnob(s, baseline_priority=(0 if s == baseline_knob else None))
+            s: ApproxKnob(s, knob_devices[s], (0 if s == baseline_knob else None))
             for s in knobs_used
         }
         op_knobs = {op: [name2knob[k] for k in knobs] for op, knobs in op_knobs.items()}
@@ -197,7 +202,6 @@ class PipedBinaryApp(ModeledApp):
             op_costs,
             op_knobs,
             knob_speedup,
-            baseline_knob,
             tune_labels,
             conf_file,
             fifo_r_file,
@@ -268,6 +272,8 @@ class HPVMConfigBuilder:
     knob_name_to_range = {
         "fp32": range(11, 12),
         "fp16": range(12, 13),
+        "perf": range(121, 158 + 1),
+        "samp": range(231, 239 + 1),
         "perf_fp16": range(151, 168 + 1),
         "samp_fp16": range(261, 269 + 1),
     }
-- 
GitLab