COMPMID-1086: Optimizing GCGEMM - Add helpers to get target GPU information

This patch moves some of the helper functions in CLHelpers.[h,cpp] to
GPUTarget.[h,cpp] in order to make them avaialable to both CL and GLES backends.

Change-Id: Ib89b05a2084b73eb643b32fac13b8367cc80b6a5
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/128988
Tested-by: Jenkins <bsgcomp@arm.com>
Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
diff --git a/arm_compute/core/CL/CLHelpers.h b/arm_compute/core/CL/CLHelpers.h
index fe2d833..feb44ce 100644
--- a/arm_compute/core/CL/CLHelpers.h
+++ b/arm_compute/core/CL/CLHelpers.h
@@ -24,7 +24,9 @@
 #ifndef __ARM_COMPUTE_CLHELPERS_H__
 #define __ARM_COMPUTE_CLHELPERS_H__
 
+#include "arm_compute/core/CL/CLTypes.h"
 #include "arm_compute/core/CL/OpenCL.h"
+#include "arm_compute/core/GPUTarget.h"
 #include "arm_compute/core/Helpers.h"
 #include "support/ToolchainSupport.h"
 
@@ -33,14 +35,6 @@
 namespace arm_compute
 {
 enum class DataType;
-enum class GPUTarget;
-
-/** Enable bitwise operations on GPUTarget enumerations */
-template <>
-struct enable_bitwise_ops<arm_compute::GPUTarget>
-{
-    static constexpr bool value = true; /**< Enabled. */
-};
 
 /** Max vector width of an OpenCL vector */
 static constexpr unsigned int max_cl_vector_width = 16;
@@ -69,48 +63,6 @@
  */
 std::string get_underlying_cl_type_from_data_type(const DataType &dt);
 
-/** Translates a given gpu device target to string.
- *
- * @param[in] target Given gpu target.
- *
- * @return The string describing the target.
- */
-const std::string &string_from_target(GPUTarget target);
-
-/** Helper function to create and return a unique_ptr pointed to a CL kernel object
- *  It also calls the kernel's configuration.
- *
- * @param[in] args All the arguments that need pass to kernel's configuration.
- *
- * @return A unique pointer pointed to a CL kernel object
- */
-template <typename Kernel, typename... T>
-std::unique_ptr<Kernel> create_configure_kernel(T &&... args)
-{
-    std::unique_ptr<Kernel> k = arm_compute::support::cpp14::make_unique<Kernel>();
-    k->configure(std::forward<T>(args)...);
-    return k;
-}
-
-/** Helper function to create and return a unique_ptr pointed to a CL kernel object
- *
- * @return A unique pointer pointed to a CL kernel object
- */
-template <typename Kernel>
-std::unique_ptr<Kernel> create_kernel()
-{
-    std::unique_ptr<Kernel> k = arm_compute::support::cpp14::make_unique<Kernel>();
-    return k;
-}
-
-/** Helper function to get the GPU target from a device name
- *
- * @param[in] device_name A device name
- *
- * @return the GPU target
- */
-GPUTarget get_target_from_name(const std::string &device_name);
-
 /** Helper function to get the GPU target from CL device
  *
  * @param[in] device A CL device
@@ -119,14 +71,6 @@
  */
 GPUTarget get_target_from_device(cl::Device &device);
 
-/** Helper function to get the GPU arch
- *
- * @param[in] target GPU target
- *
- * @return the GPU target which shows the arch
- */
-GPUTarget get_arch_from_target(GPUTarget target);
-
 /** Helper function to get the highest OpenCL version supported
  *
  * @param[in] device A CL device
@@ -158,24 +102,5 @@
  * @return True if the extension is supported
  */
 bool arm_non_uniform_workgroup_supported(const cl::Device &device);
-/** Helper function to check whether a gpu target is equal to the provided targets
- *
- * @param[in] target_to_check gpu target to check
- * @param[in] target          First target to compare against
- * @param[in] targets         (Optional) Additional targets to compare with
- *
- * @return True if the target is equal with at least one of the targets.
- */
-template <typename... Args>
-bool gpu_target_is_in(GPUTarget target_to_check, GPUTarget target, Args... targets)
-{
-    return (target_to_check == target) | gpu_target_is_in(target_to_check, targets...);
-}
-
-/** Variant of gpu_target_is_in for comparing two targets */
-inline bool gpu_target_is_in(GPUTarget target_to_check, GPUTarget target)
-{
-    return target_to_check == target;
-}
 }
 #endif /* __ARM_COMPUTE_CLHELPERS_H__ */
diff --git a/arm_compute/core/CL/ICLKernel.h b/arm_compute/core/CL/ICLKernel.h
index 2d70819..9e97064 100644
--- a/arm_compute/core/CL/ICLKernel.h
+++ b/arm_compute/core/CL/ICLKernel.h
@@ -27,6 +27,7 @@
 #include "arm_compute/core/CL/CLKernelLibrary.h"
 #include "arm_compute/core/CL/CLTypes.h"
 #include "arm_compute/core/CL/OpenCL.h"
+#include "arm_compute/core/GPUTarget.h"
 #include "arm_compute/core/IKernel.h"
 
 #include <string>
diff --git a/arm_compute/core/GLES_COMPUTE/GCHelpers.h b/arm_compute/core/GLES_COMPUTE/GCHelpers.h
index 8fbb5bb..1422afe 100644
--- a/arm_compute/core/GLES_COMPUTE/GCHelpers.h
+++ b/arm_compute/core/GLES_COMPUTE/GCHelpers.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 ARM Limited.
+ * Copyright (c) 2017-2018 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -25,43 +25,19 @@
 #define __ARM_COMPUTE_GCHELPERS_H__
 
 #include "arm_compute/core/GLES_COMPUTE/OpenGLES.h"
+#include "arm_compute/core/GPUTarget.h"
 #include "arm_compute/core/Helpers.h"
 #include "support/ToolchainSupport.h"
 
-#include <string>
-
 namespace arm_compute
 {
-namespace gles_compute
-{
-/** Helper function to create and return a unique_ptr pointed to a GLES kernel object
- *  It also calls the kernel's configuration.
- *
- * @param[in] args All the arguments that need pass to kernel's configuration.
- *
- * @return A unique pointer pointed to a GLES kernel object
- */
-template <typename Kernel, typename... T>
-std::unique_ptr<Kernel> create_configure_kernel(T &&... args)
-{
-    std::unique_ptr<Kernel> k = arm_compute::support::cpp14::make_unique<Kernel>();
-    k->configure(std::forward<T>(args)...);
-    return k;
-}
-
-/** Helper function to create and return a unique_ptr pointed to a GLES kernel object
- *
- * @return A unique pointer pointed to a GLES kernel object
- */
-template <typename Kernel>
-std::unique_ptr<Kernel> create_kernel()
-{
-    std::unique_ptr<Kernel> k = arm_compute::support::cpp14::make_unique<Kernel>();
-    return k;
-}
-
 /** Max vector width of an GLES vector */
 static constexpr unsigned int max_gc_vector_width = 16;
-} // namespace gles_compute
+
+/** Helper function to get the GPU target from GLES using GL_RENDERER enum
+ *
+ * @return the GPU target
+ */
+GPUTarget get_target_from_device();
 } // namespace arm_compute
 #endif /* __ARM_COMPUTE_GCHELPERS_H__ */
diff --git a/arm_compute/core/GLES_COMPUTE/IGCKernel.h b/arm_compute/core/GLES_COMPUTE/IGCKernel.h
index 3b98733..79d5793 100644
--- a/arm_compute/core/GLES_COMPUTE/IGCKernel.h
+++ b/arm_compute/core/GLES_COMPUTE/IGCKernel.h
@@ -26,6 +26,7 @@
 
 #include "arm_compute/core/GLES_COMPUTE/GCKernelLibrary.h"
 #include "arm_compute/core/GLES_COMPUTE/OpenGLES.h"
+#include "arm_compute/core/GPUTarget.h"
 
 #include "arm_compute/core/IKernel.h"
 
@@ -105,6 +106,24 @@
         _lws_hint = lws_hint;
     }
 
+    /** Set the targeted GPU architecture
+     *
+     * @param[in] target The targeted GPU architecture
+     */
+    void set_target(GPUTarget target)
+    {
+        _target = target;
+    }
+
+    /** Get the targeted GPU architecture
+     *
+     * @return The targeted GPU architecture.
+     */
+    GPUTarget get_target() const
+    {
+        return _target;
+    }
+
 private:
     /** Add the passed tensor's parameters to the object's kernel's arguments starting from the index idx.
      *
@@ -126,6 +145,7 @@
 protected:
     GCKernel      _kernel;   /**< GLES kernel to run */
     gles::NDRange _lws_hint; /**< Local workgroup size hint for the GLES kernel */
+    GPUTarget     _target;   /**< The targeted GPU */
 };
 
 /** Add the kernel to the command queue with the given window.
diff --git a/arm_compute/core/GPUTarget.h b/arm_compute/core/GPUTarget.h
index 8a5ca80..2292a78 100644
--- a/arm_compute/core/GPUTarget.h
+++ b/arm_compute/core/GPUTarget.h
@@ -24,6 +24,10 @@
 #ifndef __ARM_COMPUTE_GPUTARGET_H__
 #define __ARM_COMPUTE_GPUTARGET_H__
 
+#include "arm_compute/core/Helpers.h"
+
+#include <string>
+
 namespace arm_compute
 {
 /** Available GPU Targets */
@@ -45,5 +49,55 @@
     TTRX          = 0x250,
     TBOX          = 0x260
 };
+
+/** Enable bitwise operations on GPUTarget enumerations */
+template <>
+struct enable_bitwise_ops<arm_compute::GPUTarget>
+{
+    static constexpr bool value = true; /**< Enabled. */
+};
+
+/** Translates a given gpu device target to string.
+ *
+ * @param[in] target Given gpu target.
+ *
+ * @return The string describing the target.
+ */
+const std::string &string_from_target(GPUTarget target);
+
+/** Helper function to get the GPU target from a device name
+ *
+ * @param[in] device_name A device name
+ *
+ * @return the GPU target
+ */
+GPUTarget get_target_from_name(const std::string &device_name);
+
+/** Helper function to get the GPU arch
+ *
+ * @param[in] target GPU target
+ *
+ * @return the GPU target which shows the arch
+ */
+GPUTarget get_arch_from_target(GPUTarget target);
+/** Helper function to check whether a gpu target is equal to the provided targets
+ *
+ * @param[in] target_to_check gpu target to check
+ * @param[in] target          First target to compare against
+ * @param[in] targets         (Optional) Additional targets to compare with
+ *
+ * @return True if the target is equal with at least one of the targets.
+ */
+template <typename... Args>
+bool gpu_target_is_in(GPUTarget target_to_check, GPUTarget target, Args... targets)
+{
+    return (target_to_check == target) | gpu_target_is_in(target_to_check, targets...);
+}
+
+/** Variant of gpu_target_is_in for comparing two targets */
+inline bool gpu_target_is_in(GPUTarget target_to_check, GPUTarget target)
+{
+    return target_to_check == target;
+}
 } // namespace arm_compute
 #endif /* __ARM_COMPUTE_GPUTARGET_H__ */
diff --git a/arm_compute/core/Helpers.h b/arm_compute/core/Helpers.h
index 21f3c38..7d922ae 100644
--- a/arm_compute/core/Helpers.h
+++ b/arm_compute/core/Helpers.h
@@ -24,7 +24,6 @@
 #ifndef __ARM_COMPUTE_HELPERS_H__
 #define __ARM_COMPUTE_HELPERS_H__
 
-#include "arm_compute/core/CL/CLTypes.h"
 #include "arm_compute/core/Coordinates.h"
 #include "arm_compute/core/Error.h"
 #include "arm_compute/core/IAccessWindow.h"
@@ -64,6 +63,32 @@
 }
 #endif /* DOXYGEN_SKIP_THIS */
 
+/** Helper function to create and return a unique_ptr pointed to a CL/GLES kernel object
+ *  It also calls the kernel's configuration.
+ *
+ * @param[in] args All the arguments that need pass to kernel's configuration.
+ *
+ * @return A unique pointer pointed to a CL/GLES kernel object
+ */
+template <typename Kernel, typename... T>
+std::unique_ptr<Kernel> create_configure_kernel(T &&... args)
+{
+    std::unique_ptr<Kernel> k = arm_compute::support::cpp14::make_unique<Kernel>();
+    k->configure(std::forward<T>(args)...);
+    return k;
+}
+
+/** Helper function to create and return a unique_ptr pointed to a CL/GLES kernel object
+ *
+ * @return A unique pointer pointed to a Kernel kernel object
+ */
+template <typename Kernel>
+std::unique_ptr<Kernel> create_kernel()
+{
+    std::unique_ptr<Kernel> k = arm_compute::support::cpp14::make_unique<Kernel>();
+    return k;
+}
+
 namespace traits
 {
 /** Check if a type T is contained in a tuple Tuple of types */
diff --git a/arm_compute/runtime/GLES_COMPUTE/GCScheduler.h b/arm_compute/runtime/GLES_COMPUTE/GCScheduler.h
index 9bdff63..1cf2af4 100644
--- a/arm_compute/runtime/GLES_COMPUTE/GCScheduler.h
+++ b/arm_compute/runtime/GLES_COMPUTE/GCScheduler.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 ARM Limited.
+ * Copyright (c) 2017-2018 ARM Limited.
  *
  * SPDX-License-Identifier: MIT
  *
@@ -64,6 +64,24 @@
     /** Defines a barrier ordering memory transactions. */
     void memory_barrier();
 
+    /** Get the target GPU.
+     *
+     * @return The target GPU.
+     */
+    GPUTarget get_target() const
+    {
+        return _target;
+    }
+
+    /** Accessor to set target GPU to be used by the scheduler.
+     *
+     * @param[in] target The target GPU.
+     */
+    void set_target(GPUTarget target)
+    {
+        _target = target;
+    }
+
 private:
     /** Constructor */
     GCScheduler();
@@ -82,6 +100,8 @@
 
     EGLDisplay _display; /**< Underlying EGL Display. */
     EGLContext _context; /**< Underlying EGL Context. */
+
+    GPUTarget _target;
 };
 }
 #endif /* __ARM_COMPUTE_GCSCHEDULER_H__ */