Compute Library
 23.11
CpuIsaInfo.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2022 Arm Limited.
3  *
4  * SPDX-License-Identifier: MIT
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in all
14  * copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22  * SOFTWARE.
23  */
25 
26 #include "arm_compute/core/Error.h"
27 
29 
30 /* Arm Feature flags */
31 #define ARM_COMPUTE_CPU_FEATURE_HWCAP_HALF (1 << 1)
32 #define ARM_COMPUTE_CPU_FEATURE_HWCAP_NEON (1 << 12)
33 
34 /* Arm64 Feature flags */
35 #define ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMD (1 << 1)
36 #define ARM_COMPUTE_CPU_FEATURE_HWCAP_FPHP (1 << 9)
37 #define ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMDHP (1 << 10)
38 #define ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMDDP (1 << 20)
39 #define ARM_COMPUTE_CPU_FEATURE_HWCAP_SVE (1 << 22)
40 #define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVE2 (1 << 1)
41 #define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEI8MM (1 << 9)
42 #define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEF32MM (1 << 10)
43 #define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEBF16 (1 << 12)
44 #define ARM_COMPUTE_CPU_FEATURE_HWCAP2_I8MM (1 << 13)
45 #define ARM_COMPUTE_CPU_FEATURE_HWCAP2_BF16 (1 << 14)
46 #define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SME (1 << 23)
47 
48 namespace arm_compute
49 {
50 namespace cpuinfo
51 {
52 namespace
53 {
54 inline bool is_feature_supported(uint64_t features, uint64_t feature_mask)
55 {
56  return (features & feature_mask);
57 }
58 
59 #if defined(__arm__)
60 void decode_hwcaps(CpuIsaInfo &isa, const uint32_t hwcaps, const uint32_t hwcaps2)
61 {
62  ARM_COMPUTE_UNUSED(hwcaps2);
63  isa.fp16 = is_feature_supported(hwcaps, ARM_COMPUTE_CPU_FEATURE_HWCAP_HALF);
64  isa.neon = is_feature_supported(hwcaps, ARM_COMPUTE_CPU_FEATURE_HWCAP_NEON);
65 }
66 #elif defined(__aarch64__)
67 void decode_hwcaps(CpuIsaInfo &isa, const uint32_t hwcaps, const uint32_t hwcaps2)
68 {
69  // High-level SIMD support
70  isa.neon = is_feature_supported(hwcaps, ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMD);
71  isa.sve = is_feature_supported(hwcaps, ARM_COMPUTE_CPU_FEATURE_HWCAP_SVE);
72  isa.sve2 = is_feature_supported(hwcaps2, ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVE2);
73 
74  // Detection of SME from type HWCAP2 in the auxillary vector
75  isa.sme = is_feature_supported(hwcaps2, ARM_COMPUTE_CPU_FEATURE_HWCAP2_SME);
76  isa.sme2 = isa.sme; // Needs to be set properly
77 
78  // Data-type support
80  isa.bf16 = is_feature_supported(hwcaps2, ARM_COMPUTE_CPU_FEATURE_HWCAP2_BF16);
81  isa.svebf16 = is_feature_supported(hwcaps2, ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEBF16);
82 
83  // Instruction extensions
84  isa.dot = is_feature_supported(hwcaps, ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMDDP);
85  isa.i8mm = is_feature_supported(hwcaps2, ARM_COMPUTE_CPU_FEATURE_HWCAP2_I8MM);
86  isa.svei8mm = is_feature_supported(hwcaps2, ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEI8MM);
87  isa.svef32mm = is_feature_supported(hwcaps2, ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEF32MM);
88 }
89 #else /* defined(__aarch64__) */
90 void decode_hwcaps(CpuIsaInfo &isa, const uint32_t hwcaps, const uint32_t hwcaps2)
91 {
92  ARM_COMPUTE_UNUSED(isa, hwcaps, hwcaps2);
93 }
94 #endif /* defined(__aarch64__) */
95 
96 void decode_regs(CpuIsaInfo &isa,
97  const uint64_t isar0,
98  const uint64_t isar1,
99  const uint64_t pfr0,
100  const uint64_t pfr1,
101  const uint64_t svefr0)
102 {
103  auto is_supported = [](uint64_t feature_reg, uint8_t feature_pos) -> bool
104  { return ((feature_reg >> feature_pos) & 0xf); };
105 
106  // High-level SIMD support
107  isa.sve = is_supported(pfr0, 32);
108  isa.sve2 = is_supported(svefr0, 0);
109  isa.sme = is_supported(pfr1, 24);
110  isa.sme2 = (((pfr1 >> 24) & 0xf) > 1);
111 
112  // Data-type support
113  isa.fp16 = is_supported(pfr0, 16);
114  isa.bf16 = is_supported(isar1, 44);
115  isa.svebf16 = is_supported(svefr0, 20);
116 
117  // Instruction extensions
118  isa.dot = is_supported(isar0, 44);
119  isa.i8mm = is_supported(isar1, 48);
120  isa.svei8mm = is_supported(svefr0, 44);
121  isa.svef32mm = is_supported(svefr0, 52);
122 }
123 
124 /** Handle features from allow-listed models in case of problematic kernels
125  *
126  * @param[in, out] isa ISA to update
127  * @param[in] model CPU model type
128  */
129 void allowlisted_model_features(CpuIsaInfo &isa, CpuModel model)
130 {
131  if (isa.dot == false)
132  {
133  isa.dot = model_supports_dot(model);
134  }
135  if (isa.fp16 == false)
136  {
137  isa.fp16 = model_supports_fp16(model);
138  }
139 }
140 } // namespace
141 
142 CpuIsaInfo init_cpu_isa_from_hwcaps(uint32_t hwcaps, uint32_t hwcaps2, uint32_t midr)
143 {
144  CpuIsaInfo isa;
145 
146  decode_hwcaps(isa, hwcaps, hwcaps2);
147 
148  const CpuModel model = midr_to_model(midr);
149  allowlisted_model_features(isa, model);
150 
151  return isa;
152 }
153 
154 CpuIsaInfo
155 init_cpu_isa_from_regs(uint64_t isar0, uint64_t isar1, uint64_t pfr0, uint64_t pfr1, uint64_t svefr0, uint64_t midr)
156 {
157  CpuIsaInfo isa;
158 
159  decode_regs(isa, isar0, isar1, pfr0, pfr1, svefr0);
160 
161  const CpuModel model = midr_to_model(midr);
162  allowlisted_model_features(isa, model);
163 
164  return isa;
165 }
166 } // namespace cpuinfo
167 } // namespace arm_compute
CpuModel.h
arm_conv::pooling::is_supported
bool is_supported(const PoolingArgs &args, const Nothing &)
Definition: pooling_implementation.hpp:106
arm_compute::cpuinfo::CpuIsaInfo
CPU ISA (Instruction Set Architecture) information.
Definition: CpuIsaInfo.h:37
arm_compute::cpuinfo::model_supports_dot
bool model_supports_dot(CpuModel model)
Check if a model supports dot product.
Definition: CpuModel.cpp:64
ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVE2
#define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVE2
Definition: CpuIsaInfo.cpp:40
arm_compute::CPUModel
CPUModel
CPU models types.
Definition: CPPTypes.h:59
ARM_COMPUTE_CPU_FEATURE_HWCAP_HALF
#define ARM_COMPUTE_CPU_FEATURE_HWCAP_HALF
Definition: CpuIsaInfo.cpp:31
ARM_COMPUTE_CPU_FEATURE_HWCAP2_SME
#define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SME
Definition: CpuIsaInfo.cpp:46
ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEI8MM
#define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEI8MM
Definition: CpuIsaInfo.cpp:41
ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMDHP
#define ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMDHP
Definition: CpuIsaInfo.cpp:37
ARM_COMPUTE_CPU_FEATURE_HWCAP_SVE
#define ARM_COMPUTE_CPU_FEATURE_HWCAP_SVE
Definition: CpuIsaInfo.cpp:39
Error.h
arm_compute::cpuinfo::midr_to_model
CpuModel midr_to_model(uint32_t midr)
Extract the model type from the MIDR value.
Definition: CpuModel.cpp:80
CpuIsaInfo.h
arm_compute::cpuinfo::init_cpu_isa_from_regs
CpuIsaInfo init_cpu_isa_from_regs(uint64_t isar0, uint64_t isar1, uint64_t pfr0, uint64_t pfr1, uint64_t svefr0, uint64_t midr)
Identify ISA related information through register information.
Definition: CpuIsaInfo.cpp:155
ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEBF16
#define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEBF16
Definition: CpuIsaInfo.cpp:43
arm_compute::cpuinfo::CpuModel
arm_compute::CPUModel CpuModel
Definition: CpuModel.h:36
ARM_COMPUTE_CPU_FEATURE_HWCAP_NEON
#define ARM_COMPUTE_CPU_FEATURE_HWCAP_NEON
Definition: CpuIsaInfo.cpp:32
ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMDDP
#define ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMDDP
Definition: CpuIsaInfo.cpp:38
ARM_COMPUTE_UNUSED
#define ARM_COMPUTE_UNUSED(...)
To avoid unused variables warnings.
Definition: Error.h:151
ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEF32MM
#define ARM_COMPUTE_CPU_FEATURE_HWCAP2_SVEF32MM
Definition: CpuIsaInfo.cpp:42
arm_compute::cpuinfo::model_supports_fp16
bool model_supports_fp16(CpuModel model)
Check if a model supports half-precision floating point arithmetic.
Definition: CpuModel.cpp:46
arm_compute
Copyright (c) 2017-2023 Arm Limited.
Definition: introduction.dox:24
ARM_COMPUTE_CPU_FEATURE_HWCAP2_BF16
#define ARM_COMPUTE_CPU_FEATURE_HWCAP2_BF16
Definition: CpuIsaInfo.cpp:45
ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMD
#define ARM_COMPUTE_CPU_FEATURE_HWCAP_ASIMD
Definition: CpuIsaInfo.cpp:35
ARM_COMPUTE_CPU_FEATURE_HWCAP_FPHP
#define ARM_COMPUTE_CPU_FEATURE_HWCAP_FPHP
Definition: CpuIsaInfo.cpp:36
arm_compute::cpuinfo::init_cpu_isa_from_hwcaps
CpuIsaInfo init_cpu_isa_from_hwcaps(uint32_t hwcaps, uint32_t hwcaps2, uint32_t midr)
Identify ISA related information through system information.
Definition: CpuIsaInfo.cpp:142
ARM_COMPUTE_CPU_FEATURE_HWCAP2_I8MM
#define ARM_COMPUTE_CPU_FEATURE_HWCAP2_I8MM
Definition: CpuIsaInfo.cpp:44
isa
cpuinfo::CpuIsaInfo isa
Definition: NEFuseBatchNormalizationKernel.cpp:52