1*4bdc9457SAndroid Build Coastguard Worker // Copyright 2019 Google LLC
2*4bdc9457SAndroid Build Coastguard Worker //
3*4bdc9457SAndroid Build Coastguard Worker // This source code is licensed under the BSD-style license found in the
4*4bdc9457SAndroid Build Coastguard Worker // LICENSE file in the root directory of this source tree.
5*4bdc9457SAndroid Build Coastguard Worker
6*4bdc9457SAndroid Build Coastguard Worker #include <cstdio>
7*4bdc9457SAndroid Build Coastguard Worker #include <cstdlib>
8*4bdc9457SAndroid Build Coastguard Worker #include <cstring>
9*4bdc9457SAndroid Build Coastguard Worker #include <mutex>
10*4bdc9457SAndroid Build Coastguard Worker
11*4bdc9457SAndroid Build Coastguard Worker #ifdef __linux__
12*4bdc9457SAndroid Build Coastguard Worker #include <sched.h>
13*4bdc9457SAndroid Build Coastguard Worker #endif
14*4bdc9457SAndroid Build Coastguard Worker #if defined(__ANDROID__) || defined(_WIN32) || defined(__CYGWIN__)
15*4bdc9457SAndroid Build Coastguard Worker #include <malloc.h>
16*4bdc9457SAndroid Build Coastguard Worker #endif
17*4bdc9457SAndroid Build Coastguard Worker #if defined(__SSE__) || defined(__x86_64__)
18*4bdc9457SAndroid Build Coastguard Worker #include <xmmintrin.h>
19*4bdc9457SAndroid Build Coastguard Worker #endif
20*4bdc9457SAndroid Build Coastguard Worker
21*4bdc9457SAndroid Build Coastguard Worker #include <cpuinfo.h>
22*4bdc9457SAndroid Build Coastguard Worker
23*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack.h>
24*4bdc9457SAndroid Build Coastguard Worker #include <xnnpack/allocator.h>
25*4bdc9457SAndroid Build Coastguard Worker
26*4bdc9457SAndroid Build Coastguard Worker #include "bench/utils.h"
27*4bdc9457SAndroid Build Coastguard Worker
28*4bdc9457SAndroid Build Coastguard Worker static void* wipe_buffer = nullptr;
29*4bdc9457SAndroid Build Coastguard Worker static size_t wipe_buffer_size = 0;
30*4bdc9457SAndroid Build Coastguard Worker
31*4bdc9457SAndroid Build Coastguard Worker static std::once_flag wipe_buffer_guard;
32*4bdc9457SAndroid Build Coastguard Worker
InitWipeBuffer()33*4bdc9457SAndroid Build Coastguard Worker static void InitWipeBuffer() {
34*4bdc9457SAndroid Build Coastguard Worker // Default: the largest know cache size (128 MB Intel Crystalwell L4 cache).
35*4bdc9457SAndroid Build Coastguard Worker wipe_buffer_size = 128 * 1024 * 1024;
36*4bdc9457SAndroid Build Coastguard Worker if (cpuinfo_initialize()) {
37*4bdc9457SAndroid Build Coastguard Worker wipe_buffer_size = benchmark::utils::GetMaxCacheSize();
38*4bdc9457SAndroid Build Coastguard Worker }
39*4bdc9457SAndroid Build Coastguard Worker #if defined(_WIN32)
40*4bdc9457SAndroid Build Coastguard Worker wipe_buffer = _aligned_malloc(wipe_buffer_size, 128);
41*4bdc9457SAndroid Build Coastguard Worker #elif defined(__ANDROID__) || defined(__CYGWIN__)
42*4bdc9457SAndroid Build Coastguard Worker // memalign is obsolete, but it is the only option on Android until API level 17.
43*4bdc9457SAndroid Build Coastguard Worker wipe_buffer = memalign(128, wipe_buffer_size);
44*4bdc9457SAndroid Build Coastguard Worker #else
45*4bdc9457SAndroid Build Coastguard Worker (void) posix_memalign((void**) &wipe_buffer, 128, wipe_buffer_size);
46*4bdc9457SAndroid Build Coastguard Worker #endif
47*4bdc9457SAndroid Build Coastguard Worker if (wipe_buffer != nullptr) {
48*4bdc9457SAndroid Build Coastguard Worker memset(wipe_buffer, 0xA5, wipe_buffer_size);
49*4bdc9457SAndroid Build Coastguard Worker }
50*4bdc9457SAndroid Build Coastguard Worker }
51*4bdc9457SAndroid Build Coastguard Worker
52*4bdc9457SAndroid Build Coastguard Worker namespace benchmark {
53*4bdc9457SAndroid Build Coastguard Worker namespace utils {
54*4bdc9457SAndroid Build Coastguard Worker
PrefetchToL1(const void * ptr,size_t size)55*4bdc9457SAndroid Build Coastguard Worker uint32_t PrefetchToL1(const void* ptr, size_t size) {
56*4bdc9457SAndroid Build Coastguard Worker uint32_t step = 16;
57*4bdc9457SAndroid Build Coastguard Worker if (cpuinfo_initialize()) {
58*4bdc9457SAndroid Build Coastguard Worker step = cpuinfo_get_l1d_cache(0)->line_size;
59*4bdc9457SAndroid Build Coastguard Worker }
60*4bdc9457SAndroid Build Coastguard Worker const uint8_t* u8_ptr = static_cast<const uint8_t*>(ptr);
61*4bdc9457SAndroid Build Coastguard Worker // Compute and return sum of data to prevent compiler from removing data reads.
62*4bdc9457SAndroid Build Coastguard Worker uint32_t sum = 0;
63*4bdc9457SAndroid Build Coastguard Worker while (size >= step) {
64*4bdc9457SAndroid Build Coastguard Worker sum += uint32_t(*u8_ptr);
65*4bdc9457SAndroid Build Coastguard Worker u8_ptr += step;
66*4bdc9457SAndroid Build Coastguard Worker size -= step;
67*4bdc9457SAndroid Build Coastguard Worker }
68*4bdc9457SAndroid Build Coastguard Worker return sum;
69*4bdc9457SAndroid Build Coastguard Worker }
70*4bdc9457SAndroid Build Coastguard Worker
WipeCache()71*4bdc9457SAndroid Build Coastguard Worker uint32_t WipeCache() {
72*4bdc9457SAndroid Build Coastguard Worker std::call_once(wipe_buffer_guard, InitWipeBuffer);
73*4bdc9457SAndroid Build Coastguard Worker return PrefetchToL1(wipe_buffer, wipe_buffer_size);
74*4bdc9457SAndroid Build Coastguard Worker }
75*4bdc9457SAndroid Build Coastguard Worker
DisableDenormals()76*4bdc9457SAndroid Build Coastguard Worker void DisableDenormals() {
77*4bdc9457SAndroid Build Coastguard Worker #if defined(__SSE__) || defined(__x86_64__)
78*4bdc9457SAndroid Build Coastguard Worker _mm_setcsr(_mm_getcsr() | 0x8040);
79*4bdc9457SAndroid Build Coastguard Worker #elif defined(__arm__) && defined(__ARM_FP) && (__ARM_FP != 0)
80*4bdc9457SAndroid Build Coastguard Worker uint32_t fpscr;
81*4bdc9457SAndroid Build Coastguard Worker #if defined(__thumb__) && !defined(__thumb2__)
82*4bdc9457SAndroid Build Coastguard Worker __asm__ __volatile__(
83*4bdc9457SAndroid Build Coastguard Worker "VMRS %[fpscr], fpscr\n"
84*4bdc9457SAndroid Build Coastguard Worker "ORRS %[fpscr], %[bitmask]\n"
85*4bdc9457SAndroid Build Coastguard Worker "VMSR fpscr, %[fpscr]\n"
86*4bdc9457SAndroid Build Coastguard Worker : [fpscr] "=l" (fpscr)
87*4bdc9457SAndroid Build Coastguard Worker : [bitmask] "l" (0x1000000)
88*4bdc9457SAndroid Build Coastguard Worker : "cc");
89*4bdc9457SAndroid Build Coastguard Worker #else
90*4bdc9457SAndroid Build Coastguard Worker __asm__ __volatile__(
91*4bdc9457SAndroid Build Coastguard Worker "VMRS %[fpscr], fpscr\n"
92*4bdc9457SAndroid Build Coastguard Worker "ORR %[fpscr], #0x1000000\n"
93*4bdc9457SAndroid Build Coastguard Worker "VMSR fpscr, %[fpscr]\n"
94*4bdc9457SAndroid Build Coastguard Worker : [fpscr] "=r" (fpscr));
95*4bdc9457SAndroid Build Coastguard Worker #endif
96*4bdc9457SAndroid Build Coastguard Worker #elif defined(__aarch64__)
97*4bdc9457SAndroid Build Coastguard Worker uint64_t fpcr;
98*4bdc9457SAndroid Build Coastguard Worker __asm__ __volatile__(
99*4bdc9457SAndroid Build Coastguard Worker "MRS %[fpcr], fpcr\n"
100*4bdc9457SAndroid Build Coastguard Worker "ORR %w[fpcr], %w[fpcr], 0x1000000\n"
101*4bdc9457SAndroid Build Coastguard Worker "ORR %w[fpcr], %w[fpcr], 0x80000\n"
102*4bdc9457SAndroid Build Coastguard Worker "MSR fpcr, %[fpcr]\n"
103*4bdc9457SAndroid Build Coastguard Worker : [fpcr] "=r" (fpcr));
104*4bdc9457SAndroid Build Coastguard Worker #endif
105*4bdc9457SAndroid Build Coastguard Worker }
106*4bdc9457SAndroid Build Coastguard Worker
107*4bdc9457SAndroid Build Coastguard Worker // Return clockrate in Hz
GetCurrentCpuFrequency()108*4bdc9457SAndroid Build Coastguard Worker uint64_t GetCurrentCpuFrequency() {
109*4bdc9457SAndroid Build Coastguard Worker #ifdef __linux__
110*4bdc9457SAndroid Build Coastguard Worker int freq = 0;
111*4bdc9457SAndroid Build Coastguard Worker char cpuinfo_name[512];
112*4bdc9457SAndroid Build Coastguard Worker int cpu = sched_getcpu();
113*4bdc9457SAndroid Build Coastguard Worker snprintf(cpuinfo_name, sizeof(cpuinfo_name),
114*4bdc9457SAndroid Build Coastguard Worker "/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq", cpu);
115*4bdc9457SAndroid Build Coastguard Worker
116*4bdc9457SAndroid Build Coastguard Worker FILE* f = fopen(cpuinfo_name, "r");
117*4bdc9457SAndroid Build Coastguard Worker if (f) {
118*4bdc9457SAndroid Build Coastguard Worker if (fscanf(f, "%d", &freq)) {
119*4bdc9457SAndroid Build Coastguard Worker fclose(f);
120*4bdc9457SAndroid Build Coastguard Worker return uint64_t(freq) * 1000;
121*4bdc9457SAndroid Build Coastguard Worker }
122*4bdc9457SAndroid Build Coastguard Worker fclose(f);
123*4bdc9457SAndroid Build Coastguard Worker }
124*4bdc9457SAndroid Build Coastguard Worker #endif // __linux__
125*4bdc9457SAndroid Build Coastguard Worker return 0;
126*4bdc9457SAndroid Build Coastguard Worker }
127*4bdc9457SAndroid Build Coastguard Worker
GetMaxCacheSize()128*4bdc9457SAndroid Build Coastguard Worker size_t GetMaxCacheSize() {
129*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize()) {
130*4bdc9457SAndroid Build Coastguard Worker #if CPUINFO_ARCH_ARM || CPUINFO_ARCH_ARM64
131*4bdc9457SAndroid Build Coastguard Worker // DynamIQ max: 4 MB
132*4bdc9457SAndroid Build Coastguard Worker return 4 * 1024 * 1024;
133*4bdc9457SAndroid Build Coastguard Worker #else
134*4bdc9457SAndroid Build Coastguard Worker // Intel eDRAM max: 128 MB
135*4bdc9457SAndroid Build Coastguard Worker return 128 * 1024 * 1024;
136*4bdc9457SAndroid Build Coastguard Worker #endif
137*4bdc9457SAndroid Build Coastguard Worker }
138*4bdc9457SAndroid Build Coastguard Worker return cpuinfo_get_max_cache_size();
139*4bdc9457SAndroid Build Coastguard Worker }
140*4bdc9457SAndroid Build Coastguard Worker
MultiThreadingParameters(benchmark::internal::Benchmark * benchmark)141*4bdc9457SAndroid Build Coastguard Worker void MultiThreadingParameters(benchmark::internal::Benchmark* benchmark) {
142*4bdc9457SAndroid Build Coastguard Worker benchmark->ArgName("T");
143*4bdc9457SAndroid Build Coastguard Worker
144*4bdc9457SAndroid Build Coastguard Worker // Disabled thread pool (execution on the caller thread only).
145*4bdc9457SAndroid Build Coastguard Worker benchmark->Arg(1);
146*4bdc9457SAndroid Build Coastguard Worker
147*4bdc9457SAndroid Build Coastguard Worker if (cpuinfo_initialize()) {
148*4bdc9457SAndroid Build Coastguard Worker // All cores except the little ones.
149*4bdc9457SAndroid Build Coastguard Worker uint32_t max_cores = cpuinfo_get_cores_count();
150*4bdc9457SAndroid Build Coastguard Worker if (cpuinfo_get_clusters_count() > 1) {
151*4bdc9457SAndroid Build Coastguard Worker max_cores -= cpuinfo_get_cluster(cpuinfo_get_clusters_count() - 1)->core_count;
152*4bdc9457SAndroid Build Coastguard Worker }
153*4bdc9457SAndroid Build Coastguard Worker for (uint32_t t = 2; t <= max_cores; t++) {
154*4bdc9457SAndroid Build Coastguard Worker benchmark->Arg(t);
155*4bdc9457SAndroid Build Coastguard Worker }
156*4bdc9457SAndroid Build Coastguard Worker
157*4bdc9457SAndroid Build Coastguard Worker // All cores (if more than one cluster).
158*4bdc9457SAndroid Build Coastguard Worker if (cpuinfo_get_cores_count() > max_cores) {
159*4bdc9457SAndroid Build Coastguard Worker benchmark->Arg(cpuinfo_get_cores_count());
160*4bdc9457SAndroid Build Coastguard Worker }
161*4bdc9457SAndroid Build Coastguard Worker
162*4bdc9457SAndroid Build Coastguard Worker // All cores + hyperthreads (only if hyperthreading supported).
163*4bdc9457SAndroid Build Coastguard Worker if (cpuinfo_get_processors_count() > cpuinfo_get_cores_count()) {
164*4bdc9457SAndroid Build Coastguard Worker benchmark->Arg(cpuinfo_get_processors_count());
165*4bdc9457SAndroid Build Coastguard Worker }
166*4bdc9457SAndroid Build Coastguard Worker }
167*4bdc9457SAndroid Build Coastguard Worker }
168*4bdc9457SAndroid Build Coastguard Worker
169*4bdc9457SAndroid Build Coastguard Worker
CheckVFP(benchmark::State & state)170*4bdc9457SAndroid Build Coastguard Worker bool CheckVFP(benchmark::State& state) {
171*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !(cpuinfo_has_arm_vfpv2() || cpuinfo_has_arm_vfpv3())) {
172*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no VFP extension");
173*4bdc9457SAndroid Build Coastguard Worker return false;
174*4bdc9457SAndroid Build Coastguard Worker }
175*4bdc9457SAndroid Build Coastguard Worker return true;
176*4bdc9457SAndroid Build Coastguard Worker }
177*4bdc9457SAndroid Build Coastguard Worker
CheckARMV6(benchmark::State & state)178*4bdc9457SAndroid Build Coastguard Worker bool CheckARMV6(benchmark::State& state) {
179*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_arm_v6()) {
180*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no ARMv6 extension");
181*4bdc9457SAndroid Build Coastguard Worker return false;
182*4bdc9457SAndroid Build Coastguard Worker }
183*4bdc9457SAndroid Build Coastguard Worker return true;
184*4bdc9457SAndroid Build Coastguard Worker }
185*4bdc9457SAndroid Build Coastguard Worker
CheckNEON(benchmark::State & state)186*4bdc9457SAndroid Build Coastguard Worker bool CheckNEON(benchmark::State& state) {
187*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_arm_neon()) {
188*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no NEON extension");
189*4bdc9457SAndroid Build Coastguard Worker return false;
190*4bdc9457SAndroid Build Coastguard Worker }
191*4bdc9457SAndroid Build Coastguard Worker return true;
192*4bdc9457SAndroid Build Coastguard Worker }
193*4bdc9457SAndroid Build Coastguard Worker
CheckNEONFP16(benchmark::State & state)194*4bdc9457SAndroid Build Coastguard Worker bool CheckNEONFP16(benchmark::State& state) {
195*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_arm_neon_fp16()) {
196*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no NEON-FP16 extension");
197*4bdc9457SAndroid Build Coastguard Worker return false;
198*4bdc9457SAndroid Build Coastguard Worker }
199*4bdc9457SAndroid Build Coastguard Worker return true;
200*4bdc9457SAndroid Build Coastguard Worker }
201*4bdc9457SAndroid Build Coastguard Worker
CheckNEONFMA(benchmark::State & state)202*4bdc9457SAndroid Build Coastguard Worker bool CheckNEONFMA(benchmark::State& state) {
203*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_arm_neon_fma()) {
204*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no NEON-FMA extension");
205*4bdc9457SAndroid Build Coastguard Worker return false;
206*4bdc9457SAndroid Build Coastguard Worker }
207*4bdc9457SAndroid Build Coastguard Worker return true;
208*4bdc9457SAndroid Build Coastguard Worker }
209*4bdc9457SAndroid Build Coastguard Worker
CheckNEONV8(benchmark::State & state)210*4bdc9457SAndroid Build Coastguard Worker bool CheckNEONV8(benchmark::State& state) {
211*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_arm_neon_v8()) {
212*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no NEON-V8 extension");
213*4bdc9457SAndroid Build Coastguard Worker return false;
214*4bdc9457SAndroid Build Coastguard Worker }
215*4bdc9457SAndroid Build Coastguard Worker return true;
216*4bdc9457SAndroid Build Coastguard Worker }
217*4bdc9457SAndroid Build Coastguard Worker
CheckNEONFP16ARITH(benchmark::State & state)218*4bdc9457SAndroid Build Coastguard Worker bool CheckNEONFP16ARITH(benchmark::State& state) {
219*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_arm_neon_fp16_arith()) {
220*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no NEON-FP16-ARITH extension");
221*4bdc9457SAndroid Build Coastguard Worker return false;
222*4bdc9457SAndroid Build Coastguard Worker }
223*4bdc9457SAndroid Build Coastguard Worker return true;
224*4bdc9457SAndroid Build Coastguard Worker }
225*4bdc9457SAndroid Build Coastguard Worker
CheckNEONBF16(benchmark::State & state)226*4bdc9457SAndroid Build Coastguard Worker bool CheckNEONBF16(benchmark::State& state) {
227*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_arm_neon_bf16()) {
228*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no NEON-BF16 extension");
229*4bdc9457SAndroid Build Coastguard Worker return false;
230*4bdc9457SAndroid Build Coastguard Worker }
231*4bdc9457SAndroid Build Coastguard Worker return true;
232*4bdc9457SAndroid Build Coastguard Worker }
233*4bdc9457SAndroid Build Coastguard Worker
CheckNEONDOT(benchmark::State & state)234*4bdc9457SAndroid Build Coastguard Worker bool CheckNEONDOT(benchmark::State& state) {
235*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_arm_neon_dot()) {
236*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no NEON-DOT extension");
237*4bdc9457SAndroid Build Coastguard Worker return false;
238*4bdc9457SAndroid Build Coastguard Worker }
239*4bdc9457SAndroid Build Coastguard Worker return true;
240*4bdc9457SAndroid Build Coastguard Worker }
241*4bdc9457SAndroid Build Coastguard Worker
CheckSSSE3(benchmark::State & state)242*4bdc9457SAndroid Build Coastguard Worker bool CheckSSSE3(benchmark::State& state) {
243*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_ssse3()) {
244*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no SSSE3 extension");
245*4bdc9457SAndroid Build Coastguard Worker return false;
246*4bdc9457SAndroid Build Coastguard Worker }
247*4bdc9457SAndroid Build Coastguard Worker return true;
248*4bdc9457SAndroid Build Coastguard Worker }
249*4bdc9457SAndroid Build Coastguard Worker
CheckSSE41(benchmark::State & state)250*4bdc9457SAndroid Build Coastguard Worker bool CheckSSE41(benchmark::State& state) {
251*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_sse4_1()) {
252*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no SSE4.1 extension");
253*4bdc9457SAndroid Build Coastguard Worker return false;
254*4bdc9457SAndroid Build Coastguard Worker }
255*4bdc9457SAndroid Build Coastguard Worker return true;
256*4bdc9457SAndroid Build Coastguard Worker }
257*4bdc9457SAndroid Build Coastguard Worker
CheckAVX(benchmark::State & state)258*4bdc9457SAndroid Build Coastguard Worker bool CheckAVX(benchmark::State& state) {
259*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_avx()) {
260*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no AVX extension");
261*4bdc9457SAndroid Build Coastguard Worker return false;
262*4bdc9457SAndroid Build Coastguard Worker }
263*4bdc9457SAndroid Build Coastguard Worker return true;
264*4bdc9457SAndroid Build Coastguard Worker }
265*4bdc9457SAndroid Build Coastguard Worker
CheckF16C(benchmark::State & state)266*4bdc9457SAndroid Build Coastguard Worker bool CheckF16C(benchmark::State& state) {
267*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_f16c()) {
268*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no F16C extension");
269*4bdc9457SAndroid Build Coastguard Worker return false;
270*4bdc9457SAndroid Build Coastguard Worker }
271*4bdc9457SAndroid Build Coastguard Worker return true;
272*4bdc9457SAndroid Build Coastguard Worker }
273*4bdc9457SAndroid Build Coastguard Worker
CheckXOP(benchmark::State & state)274*4bdc9457SAndroid Build Coastguard Worker bool CheckXOP(benchmark::State& state) {
275*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_xop()) {
276*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no XOP extension");
277*4bdc9457SAndroid Build Coastguard Worker return false;
278*4bdc9457SAndroid Build Coastguard Worker }
279*4bdc9457SAndroid Build Coastguard Worker return true;
280*4bdc9457SAndroid Build Coastguard Worker }
281*4bdc9457SAndroid Build Coastguard Worker
CheckFMA3(benchmark::State & state)282*4bdc9457SAndroid Build Coastguard Worker bool CheckFMA3(benchmark::State& state) {
283*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_fma3()) {
284*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no FMA3 extension");
285*4bdc9457SAndroid Build Coastguard Worker return false;
286*4bdc9457SAndroid Build Coastguard Worker }
287*4bdc9457SAndroid Build Coastguard Worker return true;
288*4bdc9457SAndroid Build Coastguard Worker }
289*4bdc9457SAndroid Build Coastguard Worker
CheckAVX2(benchmark::State & state)290*4bdc9457SAndroid Build Coastguard Worker bool CheckAVX2(benchmark::State& state) {
291*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_avx2()) {
292*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no AVX2 extension");
293*4bdc9457SAndroid Build Coastguard Worker return false;
294*4bdc9457SAndroid Build Coastguard Worker }
295*4bdc9457SAndroid Build Coastguard Worker return true;
296*4bdc9457SAndroid Build Coastguard Worker }
297*4bdc9457SAndroid Build Coastguard Worker
CheckAVX512F(benchmark::State & state)298*4bdc9457SAndroid Build Coastguard Worker bool CheckAVX512F(benchmark::State& state) {
299*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_avx512f()) {
300*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no AVX512F extension");
301*4bdc9457SAndroid Build Coastguard Worker return false;
302*4bdc9457SAndroid Build Coastguard Worker }
303*4bdc9457SAndroid Build Coastguard Worker return true;
304*4bdc9457SAndroid Build Coastguard Worker }
305*4bdc9457SAndroid Build Coastguard Worker
CheckAVX512SKX(benchmark::State & state)306*4bdc9457SAndroid Build Coastguard Worker bool CheckAVX512SKX(benchmark::State& state) {
307*4bdc9457SAndroid Build Coastguard Worker if (!cpuinfo_initialize() || !cpuinfo_has_x86_avx512f() ||
308*4bdc9457SAndroid Build Coastguard Worker !cpuinfo_has_x86_avx512cd() || !cpuinfo_has_x86_avx512bw() ||
309*4bdc9457SAndroid Build Coastguard Worker !cpuinfo_has_x86_avx512dq() || !cpuinfo_has_x86_avx512vl())
310*4bdc9457SAndroid Build Coastguard Worker {
311*4bdc9457SAndroid Build Coastguard Worker state.SkipWithError("no AVX512 SKX extensions");
312*4bdc9457SAndroid Build Coastguard Worker return false;
313*4bdc9457SAndroid Build Coastguard Worker }
314*4bdc9457SAndroid Build Coastguard Worker return true;
315*4bdc9457SAndroid Build Coastguard Worker }
316*4bdc9457SAndroid Build Coastguard Worker
CodeMemoryHelper()317*4bdc9457SAndroid Build Coastguard Worker CodeMemoryHelper::CodeMemoryHelper() {
318*4bdc9457SAndroid Build Coastguard Worker status = xnn_allocate_code_memory(&buffer, XNN_DEFAULT_CODE_BUFFER_SIZE);
319*4bdc9457SAndroid Build Coastguard Worker }
320*4bdc9457SAndroid Build Coastguard Worker
~CodeMemoryHelper()321*4bdc9457SAndroid Build Coastguard Worker CodeMemoryHelper::~CodeMemoryHelper() {
322*4bdc9457SAndroid Build Coastguard Worker if (status == xnn_status_success) {
323*4bdc9457SAndroid Build Coastguard Worker xnn_release_code_memory(&buffer);
324*4bdc9457SAndroid Build Coastguard Worker }
325*4bdc9457SAndroid Build Coastguard Worker }
326*4bdc9457SAndroid Build Coastguard Worker
327*4bdc9457SAndroid Build Coastguard Worker } // namespace utils
328*4bdc9457SAndroid Build Coastguard Worker } // namespace benchmark
329