1*eb293b8fSAndroid Build Coastguard Worker /*
2*eb293b8fSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*eb293b8fSAndroid Build Coastguard Worker *
4*eb293b8fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*eb293b8fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*eb293b8fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*eb293b8fSAndroid Build Coastguard Worker *
8*eb293b8fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*eb293b8fSAndroid Build Coastguard Worker *
10*eb293b8fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*eb293b8fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*eb293b8fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*eb293b8fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*eb293b8fSAndroid Build Coastguard Worker * limitations under the License.
15*eb293b8fSAndroid Build Coastguard Worker */
16*eb293b8fSAndroid Build Coastguard Worker
17*eb293b8fSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
18*eb293b8fSAndroid Build Coastguard Worker
19*eb293b8fSAndroid Build Coastguard Worker #include <limits.h>
20*eb293b8fSAndroid Build Coastguard Worker #include <stdio.h>
21*eb293b8fSAndroid Build Coastguard Worker #include <stdlib.h>
22*eb293b8fSAndroid Build Coastguard Worker
23*eb293b8fSAndroid Build Coastguard Worker #include <android-base/strings.h>
24*eb293b8fSAndroid Build Coastguard Worker
25*eb293b8fSAndroid Build Coastguard Worker #include <string>
26*eb293b8fSAndroid Build Coastguard Worker #include <vector>
27*eb293b8fSAndroid Build Coastguard Worker
28*eb293b8fSAndroid Build Coastguard Worker #if defined(__APPLE__)
29*eb293b8fSAndroid Build Coastguard Worker
30*eb293b8fSAndroid Build Coastguard Worker // Darwin doesn't support this, so do nothing.
LockToCPU(int)31*eb293b8fSAndroid Build Coastguard Worker bool LockToCPU(int) {
32*eb293b8fSAndroid Build Coastguard Worker return false;
33*eb293b8fSAndroid Build Coastguard Worker }
34*eb293b8fSAndroid Build Coastguard Worker
35*eb293b8fSAndroid Build Coastguard Worker #else
36*eb293b8fSAndroid Build Coastguard Worker
37*eb293b8fSAndroid Build Coastguard Worker #include <errno.h>
38*eb293b8fSAndroid Build Coastguard Worker #include <sched.h>
39*eb293b8fSAndroid Build Coastguard Worker
LockToCPU(int lock_cpu)40*eb293b8fSAndroid Build Coastguard Worker bool LockToCPU(int lock_cpu) {
41*eb293b8fSAndroid Build Coastguard Worker cpu_set_t cpuset;
42*eb293b8fSAndroid Build Coastguard Worker
43*eb293b8fSAndroid Build Coastguard Worker CPU_ZERO(&cpuset);
44*eb293b8fSAndroid Build Coastguard Worker CPU_SET(lock_cpu, &cpuset);
45*eb293b8fSAndroid Build Coastguard Worker if (sched_setaffinity(0, sizeof(cpuset), &cpuset) != 0) {
46*eb293b8fSAndroid Build Coastguard Worker if (errno == EINVAL) {
47*eb293b8fSAndroid Build Coastguard Worker printf("Invalid cpu %d\n", lock_cpu);
48*eb293b8fSAndroid Build Coastguard Worker } else {
49*eb293b8fSAndroid Build Coastguard Worker perror("sched_setaffinity failed");
50*eb293b8fSAndroid Build Coastguard Worker }
51*eb293b8fSAndroid Build Coastguard Worker return false;
52*eb293b8fSAndroid Build Coastguard Worker }
53*eb293b8fSAndroid Build Coastguard Worker
54*eb293b8fSAndroid Build Coastguard Worker printf("Locked to cpu %d\n", lock_cpu);
55*eb293b8fSAndroid Build Coastguard Worker return true;
56*eb293b8fSAndroid Build Coastguard Worker }
57*eb293b8fSAndroid Build Coastguard Worker
58*eb293b8fSAndroid Build Coastguard Worker #endif
59*eb293b8fSAndroid Build Coastguard Worker
main(int argc,char ** argv)60*eb293b8fSAndroid Build Coastguard Worker int main(int argc, char** argv) {
61*eb293b8fSAndroid Build Coastguard Worker #if defined(__BIONIC__)
62*eb293b8fSAndroid Build Coastguard Worker // Enable decay time option to allow frees to run faster at the cost of slightly increasing RSS.
63*eb293b8fSAndroid Build Coastguard Worker // All applications on Android run with this option enabled.
64*eb293b8fSAndroid Build Coastguard Worker mallopt(M_DECAY_TIME, 1);
65*eb293b8fSAndroid Build Coastguard Worker #endif
66*eb293b8fSAndroid Build Coastguard Worker std::vector<char*> new_argv;
67*eb293b8fSAndroid Build Coastguard Worker // The first argument is not an option, so add it as is.
68*eb293b8fSAndroid Build Coastguard Worker new_argv.push_back(argv[0]);
69*eb293b8fSAndroid Build Coastguard Worker
70*eb293b8fSAndroid Build Coastguard Worker // Look for the special option --benchmark_lock_cpu.
71*eb293b8fSAndroid Build Coastguard Worker int lock_cpu = -1;
72*eb293b8fSAndroid Build Coastguard Worker for (int i = 1; i < argc; i++) {
73*eb293b8fSAndroid Build Coastguard Worker if (android::base::StartsWith(argv[i], "--benchmark_cpu=")) {
74*eb293b8fSAndroid Build Coastguard Worker char* endptr;
75*eb293b8fSAndroid Build Coastguard Worker long cpu = strtol(&argv[i][16], &endptr, 10);
76*eb293b8fSAndroid Build Coastguard Worker if (endptr == nullptr || *endptr != '\0' || cpu > INT_MAX || cpu < 0) {
77*eb293b8fSAndroid Build Coastguard Worker printf("Malformed value for --benchmark_cpu, requires a valid positive number.\n");
78*eb293b8fSAndroid Build Coastguard Worker return 1;
79*eb293b8fSAndroid Build Coastguard Worker }
80*eb293b8fSAndroid Build Coastguard Worker lock_cpu = cpu;
81*eb293b8fSAndroid Build Coastguard Worker } else {
82*eb293b8fSAndroid Build Coastguard Worker new_argv.push_back(argv[i]);
83*eb293b8fSAndroid Build Coastguard Worker }
84*eb293b8fSAndroid Build Coastguard Worker }
85*eb293b8fSAndroid Build Coastguard Worker new_argv.push_back(nullptr);
86*eb293b8fSAndroid Build Coastguard Worker
87*eb293b8fSAndroid Build Coastguard Worker if (lock_cpu != -1 && !LockToCPU(lock_cpu)) {
88*eb293b8fSAndroid Build Coastguard Worker return 1;
89*eb293b8fSAndroid Build Coastguard Worker }
90*eb293b8fSAndroid Build Coastguard Worker
91*eb293b8fSAndroid Build Coastguard Worker int new_argc = new_argv.size() - 1;
92*eb293b8fSAndroid Build Coastguard Worker ::benchmark::Initialize(&new_argc, new_argv.data());
93*eb293b8fSAndroid Build Coastguard Worker if (::benchmark::ReportUnrecognizedArguments(new_argc, new_argv.data())) return 1;
94*eb293b8fSAndroid Build Coastguard Worker ::benchmark::RunSpecifiedBenchmarks();
95*eb293b8fSAndroid Build Coastguard Worker }
96