aboutsummaryrefslogtreecommitdiff
path: root/arm_compute/core/CPP
diff options
context:
space:
mode:
authorPablo Tello <pablo.tello@arm.com>2018-03-14 17:55:27 +0000
committerAnthony Barbier <anthony.barbier@arm.com>2018-11-02 16:49:16 +0000
commit7fad9b1d00f3ee1488ba4038d1371f6ea219f8b7 (patch)
treeded71e1cfa8e0c085f8bce5dfc26a99786d60e52 /arm_compute/core/CPP
parent1562be3e8a449360a90af75f6f1481a30d41be75 (diff)
downloadComputeLibrary-7fad9b1d00f3ee1488ba4038d1371f6ea219f8b7.tar.gz
COMPMID-1021: CPUInfo refactoring.
Removed CPUTarget in favor of the CPUModel type. CPUInfo now holds a vector of N CPUs. CPUInfo autoinitialise upon construction with 1 GENERIC CPU. CPPScheduler fills CPUInfo's vector upon construction (runtime). IScheduler has a single CPUInfo obj and ThreadInfo always gets a pointer to it (avoid copying the vector) Change-Id: I30f293258c959c87f6bac5eac8b963beb6a4d365 Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/124626 Tested-by: Jenkins <bsgcomp@arm.com> Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Diffstat (limited to 'arm_compute/core/CPP')
-rw-r--r--arm_compute/core/CPP/CPPTypes.h125
1 files changed, 98 insertions, 27 deletions
diff --git a/arm_compute/core/CPP/CPPTypes.h b/arm_compute/core/CPP/CPPTypes.h
index 3abc0a2e88..8a9ada81c1 100644
--- a/arm_compute/core/CPP/CPPTypes.h
+++ b/arm_compute/core/CPP/CPPTypes.h
@@ -24,44 +24,115 @@
#ifndef __ARM_COMPUTE_CPP_TYPES_H__
#define __ARM_COMPUTE_CPP_TYPES_H__
+#include <vector>
+
namespace arm_compute
{
-/** Available CPU Targets */
-enum class CPUTarget
+/** CPU models - we only need to detect CPUs we have
+ * microarchitecture-specific code for.
+ *
+ * Architecture features are detected via HWCAPs.
+ */
+enum class CPUModel
{
- ARCH_MASK = 0x0F00,
- CPU_MODEL = 0x00FF,
- INTRINSICS = 0x0100,
- ARMV7 = 0x0200,
- ARMV8 = 0x0300,
- ARMV8_2 = 0x0400,
- A7x = 0x0070,
- A5x = 0x0050,
- DOT = 0x1000,
-
- A53 = (ARMV8 | A7x | 0x3),
- A55 = (ARMV8_2 | A5x | 0x5),
- A55_DOT = (A55 | DOT),
- A72 = (ARMV8 | A7x | 0x2),
- A73 = (ARMV8 | A7x | 0x3),
- A75 = (ARMV8_2 | A7x | 0x5),
- A75_DOT = (A75 | DOT),
+ GENERIC,
+ A53,
+ A55r0,
+ A55r1,
};
-/** Information about a CPU. */
-struct CPUInfo
+class CPUInfo final
{
- CPUTarget CPU{ CPUTarget::INTRINSICS }; /**< CPU target. */
- int L1_size{ 0 }; /**< Size of L1 cache. */
- int L2_size{ 0 }; /**< Size of L2 cache. */
+public:
+ /** Constructor */
+ CPUInfo();
+
+ /** Disable copy constructor and assignment operator to avoid copying the vector of CPUs each time
+ * CPUInfo is initialized once in the IScheduler and ThreadInfo will get a pointer to it.
+ */
+ CPUInfo &operator=(const CPUInfo &cpuinfo) = delete;
+ CPUInfo(const CPUInfo &cpuinfo) = delete;
+ CPUInfo &operator=(const CPUInfo &&cpuinfo) = delete;
+ CPUInfo(const CPUInfo &&cpuinfo) = delete;
+
+ /** Checks if the cpu model supports fp16.
+ *
+ * @return true of the cpu supports fp16, false otherwise
+ */
+ bool has_fp16() const;
+ /** Checks if the cpu model supports dot product.
+ *
+ * @return true of the cpu supports dot product, false otherwise
+ */
+ bool has_dotprod() const;
+ /** Gets the cpu model for a given cpuid.
+ *
+ * @param[in] cpuid the id of the cpu core to be retrieved,
+ *
+ * @return the @ref CPUModel of the cpuid queiried.
+ */
+ CPUModel get_cpu_model(unsigned int cpuid) const;
+ /** Gets the current thread's cpu model
+ *
+ * @return Current thread's @ref CPUModel
+ */
+ CPUModel get_cpu_model() const;
+ /** Gets the L1 cache size
+ *
+ * @return the size of the L1 cache
+ */
+ unsigned int get_L1_cache_size() const;
+ /** Gets the L2 cache size
+ *
+ * @return the size of the L1 cache
+ */
+ unsigned int get_L2_cache_size() const;
+ /** Set the L1 cache size
+ *
+ * @param[in] size the new size to be set.
+ */
+ void set_L1_cache_size(unsigned int size);
+ /** Set the L2 cache size
+ *
+ * @param[in] size the new size to be set.
+ */
+ void set_L2_cache_size(unsigned int size);
+ /** Set fp16 support
+ *
+ * @param[in] fp16 whether the cpu supports fp16.
+ */
+ void set_fp16(const bool fp16);
+ /** Set dot product support
+ *
+ * @param[in] dotprod whether the cpu supports dot product.
+ */
+ void set_dotprod(const bool dotprod);
+ /** Set the cpumodel for a given cpu core
+ *
+ * @param[in] cpuid the id of the core to be set.
+ * @param[in] model the @ref CPUModel to be set.
+ */
+ void set_cpu_model(unsigned int cpuid, CPUModel model);
+ /** Set max number of cpus
+ *
+ * @param[in] cpu_count the number of CPUs in the system.
+ */
+ void set_cpu_num(unsigned int cpu_count);
+
+private:
+ std::vector<CPUModel> _percpu = {};
+ bool _fp16 = false;
+ bool _dotprod = false;
+ unsigned int _L1_cache_size = 32768;
+ unsigned int _L2_cache_size = 262144;
};
/** Information about executing thread and CPU. */
struct ThreadInfo
{
- int thread_id{ 0 }; /**< Executing thread. */
- int num_threads{ 1 }; /**< Number of CPU threads. */
- CPUInfo cpu_info{}; /**< CPU information. */
+ int thread_id{ 0 };
+ int num_threads{ 1 };
+ const CPUInfo *cpu_info{ nullptr };
};
} // namespace arm_compute
#endif /* __ARM_COMPUTE_CPP_TYPES_H__ */