Enable dynamic cl tuning for dynamically fused kernels

* Add new tune_kernel_dynamic interface
* Add generate_config_id

Resolves: COMPMID-5154

Signed-off-by: SiCong Li <sicong.li@arm.com>
Change-Id: I39870e59fceda875487970061ceb2048995c5a45
Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/7400
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Giorgio Arena <giorgio.arena@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
diff --git a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/Common.h b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/Common.h
index e24c742..aa27572 100644
--- a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/Common.h
+++ b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/Common.h
@@ -316,6 +316,15 @@
         return "";
     }
 
+    /** Generate config id of the component
+     *
+     * @return std::string
+     */
+    virtual std::string generate_config_id() const
+    {
+        return "";
+    }
+
     virtual CLBuildOptions generate_build_options() const
     {
         return CLBuildOptions{};
@@ -537,9 +546,21 @@
         return code;
     }
 
+    /** Generate config id of the entire kernel
+     *
+     * Format: kernel_name--comp0_config_id--comp1_config_id--...
+     *
+     * @return std::string
+     */
     std::string build_config_id() const
     {
-        return "";
+        std::string config_id = build_kernel_name();
+        traverse([&](std::stack<ComponentID> stack)
+        {
+            config_id += "--" + _components.find(stack.top())->second->generate_config_id() + "--";
+        });
+
+        return config_id;
     }
 
     CLBuildOptions build_options() const
diff --git a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClElementwiseAddKernelComponent.cpp b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClElementwiseAddKernelComponent.cpp
index 34b735e..84e4003 100644
--- a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClElementwiseAddKernelComponent.cpp
+++ b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClElementwiseAddKernelComponent.cpp
@@ -128,6 +128,20 @@
     return build_opts;
 }
 
+std::string ClElementwiseAddKernelComponent::generate_config_id() const
+{
+    auto        t_dst_info = _blueprint->impl().get_kernel_argument_info(_blueprint->impl().get_dst_id());
+    std::string config_id{};
+    config_id += lower_string(string_from_data_type(t_dst_info->data_type()));
+    config_id += "_";
+    config_id += support::cpp11::to_string(t_dst_info->dimension(0));
+    config_id += "_";
+    config_id += support::cpp11::to_string(t_dst_info->dimension(1));
+    config_id += "_";
+    config_id += lower_string(string_from_data_layout(t_dst_info->data_layout()));
+    return config_id;
+}
+
 ClElementwiseAddKernelComponent::TagLUT ClElementwiseAddKernelComponent::allocate_vars(SharedVarTable &vtable) const
 {
     // Determine which argument is the accumulator
diff --git a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClElementwiseAddKernelComponent.h b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClElementwiseAddKernelComponent.h
index c259811..35c9538 100644
--- a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClElementwiseAddKernelComponent.h
+++ b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClElementwiseAddKernelComponent.h
@@ -47,6 +47,7 @@
     std::string           get_component_code() const override;
     Window                get_window() const override;
     CLBuildOptions        generate_build_options() const override;
+    std::string           generate_config_id() const override;
 
     virtual std::vector<Link> get_links() const override
     {
diff --git a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClGemmNativeKernelComponent.cpp b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClGemmNativeKernelComponent.cpp
index 7d23128..45b81b4 100644
--- a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClGemmNativeKernelComponent.cpp
+++ b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClGemmNativeKernelComponent.cpp
@@ -470,6 +470,32 @@
     return build_opts;
 }
 
+std::string ClGemmNativeKernelComponent::generate_config_id() const
+{
+    auto        t_dst_info = _blueprint->impl().get_kernel_argument_info(_blueprint->impl().get_dst_id());
+    std::string config_id{};
+    config_id += (_bias.is_empty() ? "add_bias_" : "");
+    config_id += (_desc.broadcast_bias ? "broadcast_bias_" : "");
+    config_id += (_desc.reinterpret_input_as_3d ? "3di_" : "");
+    config_id += (_desc.depth_output_gemm3d > 0 ? "3do_" : "");
+    config_id += lower_string(string_from_data_type(t_dst_info->data_type()));
+    config_id += "_";
+    config_id += support::cpp11::to_string(t_dst_info->dimension(1));
+    config_id += "_";
+    config_id += support::cpp11::to_string(t_dst_info->dimension(0));
+    config_id += "_";
+    config_id += support::cpp11::to_string(_desc.k);
+    config_id += "_";
+    config_id += support::cpp11::to_string(t_dst_info->dimension(2));
+    config_id += "_";
+    config_id += support::cpp11::to_string(_desc.lhs_info.m0);
+    config_id += "_";
+    config_id += support::cpp11::to_string(_desc.rhs_info.n0);
+    config_id += "_";
+    config_id += support::cpp11::to_string(_desc.rhs_info.k0);
+    return config_id;
+}
+
 ClGemmNativeKernelComponent::TagLUT ClGemmNativeKernelComponent::allocate_vars(SharedVarTable &vtable) const
 {
     TagLUT lut{};
diff --git a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClGemmNativeKernelComponent.h b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClGemmNativeKernelComponent.h
index 1a1e3e3..b282856 100644
--- a/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClGemmNativeKernelComponent.h
+++ b/src/core/experimental/dynamic_fusion/ClKernelBuildingImpl/components/ClGemmNativeKernelComponent.h
@@ -53,6 +53,7 @@
     Window                get_window() const override;
     ClKernelArgList       get_args();
     CLBuildOptions        generate_build_options() const override;
+    std::string           generate_config_id() const override;
 
     virtual std::vector<Link> get_links() const override
     {