blob: 072b14d72294264278af088b51e9e54c6534d9da [file] [log] [blame]
XNNPACK Teamb455b122019-09-27 18:10:33 -07001// Copyright 2019 Google LLC
2//
3// This source code is licensed under the BSD-style license found in the
4// LICENSE file in the root directory of this source tree.
5
6#pragma once
7
8#include <cstddef>
9#include <cstdint>
10
Marat Dukhanbad48fe2019-11-04 10:35:22 -080011#include <benchmark/benchmark.h>
12
XNNPACK Teamb455b122019-09-27 18:10:33 -070013namespace benchmark {
14namespace utils {
15
Marat Dukhan42323232019-10-23 02:09:02 -070016uint32_t WipeCache();
17uint32_t PrefetchToL1(const void* ptr, size_t size);
Marat Dukhand62f3cc2019-10-01 12:37:52 -070018
Marat Dukhan4a4a7fa2019-10-21 13:46:14 -070019// Disable support for denormalized numbers in floating-point units.
20void DisableDenormals();
21
Marat Dukhand62f3cc2019-10-01 12:37:52 -070022// Return clock rate, in Hz, for the currently used logical processor.
23uint64_t GetCurrentCpuFrequency();
24
25// Return maximum (across all cores/clusters/sockets) last level cache size.
26// Can overestimate, but not underestimate LLC size.
27size_t GetMaxCacheSize();
XNNPACK Teamb455b122019-09-27 18:10:33 -070028
Marat Dukhanbad48fe2019-11-04 10:35:22 -080029// Set multi-threading parameters appropriate for the processor.
30void MultiThreadingParameters(benchmark::internal::Benchmark* benchmark);
31
Marat Dukhanc8466f52019-11-25 18:01:10 -080032typedef bool (*IsaCheckFunction)(benchmark::State& state);
33
34// Check if ARM NEON extension is supported.
35// If NEON is unsupported, report error in benchmark state, and return false.
36bool CheckNEON(benchmark::State& state);
37
38// Check if ARM NEON-FMA extension is supported.
39// If NEON-FMA is unsupported, report error in benchmark state, and return false.
40bool CheckNEONFMA(benchmark::State& state);
41
42// Check if x86 SSE4.1 extension is supported.
43// If SSE4.1 is unsupported, report error in benchmark state, and return false.
44bool CheckSSE41(benchmark::State& state);
45
46// Check if x86 AVX extension is supported.
47// If AVX is unsupported, report error in benchmark state, and return false.
48bool CheckAVX(benchmark::State& state);
49
50// Check if x86 FMA3 extension is supported.
51// If FMA3 is unsupported, report error in benchmark state, and return false.
52bool CheckFMA3(benchmark::State& state);
53
54// Check if x86 AVX2 extension is supported.
55// If AVX2 is unsupported, report error in benchmark state, and return false.
56bool CheckAVX2(benchmark::State& state);
57
58// Check if x86 AVX512F extension is supported.
59// If AVX512F is unsupported, report error in benchmark state, and return false.
60bool CheckAVX512F(benchmark::State& state);
61
XNNPACK Teamb455b122019-09-27 18:10:33 -070062template <class T>
Marat Dukhan42323232019-10-23 02:09:02 -070063inline T DivideRoundUp(T x, T q) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070064 return x / q + T(x % q != 0);
65}
66
67template <class T>
Marat Dukhan42323232019-10-23 02:09:02 -070068inline T RoundUp(T x, T q) {
69 return q * DivideRoundUp(x, q);
XNNPACK Teamb455b122019-09-27 18:10:33 -070070}
71
72template <class T>
Marat Dukhan42323232019-10-23 02:09:02 -070073inline T Doz(T a, T b) {
XNNPACK Teamb455b122019-09-27 18:10:33 -070074 return a >= b ? a - b : T(0);
75}
76
77} // namespace utils
78} // namespace benchmark