]>
Commit | Line | Data |
---|---|---|
d614a753 | 1 | # Copyright (C) 2013-2020 Free Software Foundation, Inc. |
8cfdb7e0 SP |
2 | # This file is part of the GNU C Library. |
3 | ||
4 | # The GNU C Library is free software; you can redistribute it and/or | |
5 | # modify it under the terms of the GNU Lesser General Public | |
6 | # License as published by the Free Software Foundation; either | |
7 | # version 2.1 of the License, or (at your option) any later version. | |
8 | ||
9 | # The GNU C Library is distributed in the hope that it will be useful, | |
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | # Lesser General Public License for more details. | |
13 | ||
14 | # You should have received a copy of the GNU Lesser General Public | |
15 | # License along with the GNU C Library; if not, see | |
5a82c748 | 16 | # <https://www.gnu.org/licenses/>. |
8cfdb7e0 | 17 | |
8cfdb7e0 | 18 | # Makefile for benchmark tests. The only useful target here is `bench`. |
3ce9e010 | 19 | # Add benchmark functions in alphabetical order. |
8cfdb7e0 | 20 | |
8cfdb7e0 | 21 | subdir := benchtests |
a5f891ac JM |
22 | |
23 | include ../Makeconfig | |
aad287f3 | 24 | bench-math := acos acosh asin asinh atan atanh cos cosh exp exp2 log log2 \ |
da16c9b5 | 25 | modf pow rint sin sincos sinh sqrt tan tanh fmin fmax fminf \ |
642d5aba | 26 | fmaxf powf trunc truncf roundeven roundevenf expf exp2f logf \ |
2004063f | 27 | log2f sincosf sinf cosf isnan isinf isfinite hypot logb logbf \ |
03e26098 AS |
28 | exp10f |
29 | ||
30 | ifneq (,$(filter yes,$(float128-fcts) $(float128-alias-fcts))) | |
31 | bench-math += expf128 powf128 sinf128 | |
32 | endif | |
bb9c256f | 33 | |
0edbf123 | 34 | bench-pthread := pthread_once thread_create |
bb9c256f | 35 | |
aad287f3 SP |
36 | bench-string := ffs ffsll |
37 | ||
0422ed1e | 38 | ifeq (${BENCHSET},) |
aad287f3 | 39 | bench := $(bench-math) $(bench-pthread) $(bench-string) |
0422ed1e VR |
40 | else |
41 | bench := $(foreach B,$(filter bench-%,${BENCHSET}), ${${B}}) | |
42 | endif | |
3ce9e010 | 43 | |
c1f75dc3 | 44 | # String function benchmarks. |
16f87cfd | 45 | string-benchset := memccpy memchr memcmp memcpy memmem memmove \ |
aad287f3 SP |
46 | mempcpy memset rawmemchr stpcpy stpncpy strcasecmp strcasestr \ |
47 | strcat strchr strchrnul strcmp strcpy strcspn strlen \ | |
48 | strncasecmp strncat strncmp strncpy strnlen strpbrk strrchr \ | |
49 | strspn strstr strcpy_chk stpcpy_chk memrchr strsep strtok \ | |
9ec87fd2 | 50 | strcoll memcpy-large memcpy-random memmove-large memset-large \ |
5bfb0404 | 51 | memcpy-walk memset-walk memmove-walk |
2d304f3c SP |
52 | |
53 | # Build and run locale-dependent benchmarks only if we're building natively. | |
54 | ifeq (no,$(cross-compiling)) | |
aad287f3 SP |
55 | wcsmbs-benchset := wcslen wcsnlen wcscpy wcpcpy wcsncpy wcpncpy wcscat wcsncat \ |
56 | wcscmp wcsncmp wcschr wcschrnul wcsrchr wcsspn wcspbrk wcscspn \ | |
57 | wmemchr wmemset wmemcmp | |
2d304f3c SP |
58 | else |
59 | wcsmbs-benchset := | |
60 | endif | |
61 | ||
aad287f3 | 62 | string-benchset-all := $(string-benchset) ${wcsmbs-benchset} |
c1f75dc3 | 63 | |
2d304f3c | 64 | ifeq (no,$(cross-compiling)) |
60ccaf75 LH |
65 | # We have to generate locales |
66 | LOCALES := en_US.UTF-8 tr_TR.UTF-8 cs_CZ.UTF-8 fa_IR.UTF-8 fr_FR.UTF-8 \ | |
67 | ja_JP.UTF-8 si_LK.UTF-8 en_GB.UTF-8 vi_VN.UTF-8 ar_SA.UTF-8 \ | |
68 | da_DK.UTF-8 pl_PL.UTF-8 pt_PT.UTF-8 el_GR.UTF-8 ru_RU.UTF-8 \ | |
20003c49 | 69 | he_IL.UTF-8 is_IS.UTF-8 es_ES.UTF-8 hi_IN.UTF-8 sv_SE.UTF-8 \ |
60ccaf75 LH |
70 | hu_HU.UTF-8 it_IT.UTF-8 sr_RS.UTF-8 zh_CN.UTF-8 |
71 | include ../gen-locales.mk | |
2d304f3c | 72 | endif |
60ccaf75 | 73 | |
aad287f3 | 74 | stdlib-benchset := strtod |
450a2e2d | 75 | |
aad287f3 | 76 | stdio-common-benchset := sprintf |
608f8971 | 77 | |
cb2f668d WD |
78 | math-benchset := math-inlines |
79 | ||
0422ed1e | 80 | ifeq (${BENCHSET},) |
aad287f3 | 81 | benchset := $(string-benchset-all) $(stdlib-benchset) $(stdio-common-benchset) \ |
cb2f668d | 82 | $(math-benchset) |
0422ed1e VR |
83 | else |
84 | benchset := $(foreach B,$(filter %-benchset,${BENCHSET}), ${${B}}) | |
85 | endif | |
c1f75dc3 | 86 | |
f6c55796 WN |
87 | CFLAGS-bench-ffs.c += -fno-builtin |
88 | CFLAGS-bench-ffsll.c += -fno-builtin | |
7a8330c0 | 89 | CFLAGS-bench-sqrt.c += -fno-builtin |
5d1f604a | 90 | CFLAGS-bench-fmin.c += -fno-builtin |
da16c9b5 | 91 | CFLAGS-bench-fminf.c += -fno-builtin |
5d1f604a | 92 | CFLAGS-bench-fmax.c += -fno-builtin |
da16c9b5 | 93 | CFLAGS-bench-fmaxf.c += -fno-builtin |
eb375def JM |
94 | CFLAGS-bench-trunc.c += -fno-builtin |
95 | CFLAGS-bench-truncf.c += -fno-builtin | |
642d5aba STH |
96 | CFLAGS-bench-roundeven.c += -fno-builtin |
97 | CFLAGS-bench-roundevenf.c += -fno-builtin | |
2731a326 AZ |
98 | CFLAGS-bench-isnan.c += -fsignaling-nans |
99 | CFLAGS-bench-isinf.c += -fsignaling-nans | |
100 | CFLAGS-bench-isfinite.c += -fsignaling-nans | |
f6c55796 | 101 | |
0422ed1e | 102 | ifeq (${BENCHSET},) |
3904fd85 | 103 | bench-malloc := malloc-thread malloc-simple |
0422ed1e VR |
104 | else |
105 | bench-malloc := $(filter malloc-%,${BENCHSET}) | |
106 | endif | |
b01ee67c | 107 | |
79520f4b | 108 | $(addprefix $(objpfx)bench-,$(bench-math)): $(libm) |
cb2f668d | 109 | $(addprefix $(objpfx)bench-,$(math-benchset)): $(libm) |
79520f4b | 110 | $(addprefix $(objpfx)bench-,$(bench-pthread)): $(shared-thread-library) |
3904fd85 | 111 | $(addprefix $(objpfx)bench-,$(bench-malloc)): $(shared-thread-library) |
7849ff93 | 112 | |
8fc1bee5 SP |
113 | \f |
114 | ||
115 | # Rules to build and execute the benchmarks. Do not put any benchmark | |
116 | # parameters beyond this point. | |
117 | ||
c1f75dc3 SP |
118 | # We don't want the benchmark programs to run in parallel since that could |
119 | # affect their performance. | |
120 | .NOTPARALLEL: | |
121 | ||
4504783c FW |
122 | bench-extra-objs = json-lib.o |
123 | ||
124 | extra-objs += $(bench-extra-objs) | |
125 | others-extras = $(bench-extra-objs) | |
126 | ||
8cfdb7e0 | 127 | include ../Rules |
8fc1bee5 SP |
128 | |
129 | binaries-bench := $(addprefix $(objpfx)bench-,$(bench)) | |
c1f75dc3 | 130 | binaries-benchset := $(addprefix $(objpfx)bench-,$(benchset)) |
b01ee67c | 131 | binaries-bench-malloc := $(addprefix $(objpfx)bench-,$(bench-malloc)) |
8fc1bee5 | 132 | |
fe92a91f | 133 | # The default duration: 1 seconds. |
d569c6ee | 134 | ifndef BENCH_DURATION |
fe92a91f | 135 | BENCH_DURATION := 1 |
d569c6ee SP |
136 | endif |
137 | ||
f1c8185d | 138 | CPPFLAGS-nonlib += -DDURATION=$(BENCH_DURATION) -D_ISOMAC |
d569c6ee | 139 | |
e52434a2 L |
140 | # Use clock_gettime to measure performance of functions. The default is |
141 | # to use the architecture-specific high precision timing instructions. | |
142 | ifdef USE_CLOCK_GETTIME | |
143 | CPPFLAGS-nonlib += -DUSE_CLOCK_GETTIME | |
144 | else | |
7cc65773 L |
145 | # On x86 processors, use RDTSCP, instead of RDTSC, to measure performance |
146 | # of functions. All x86 processors since 2010 support RDTSCP instruction. | |
147 | ifdef USE_RDTSCP | |
148 | CPPFLAGS-nonlib += -DUSE_RDTSCP | |
149 | endif | |
e52434a2 | 150 | endif |
43fe811b | 151 | |
56737508 SP |
152 | DETAILED_OPT := |
153 | ||
154 | ifdef DETAILED | |
155 | DETAILED_OPT := -d | |
156 | endif | |
157 | ||
4856bcd2 SP |
158 | # This makes sure CPPFLAGS-nonlib and CFLAGS-nonlib are passed |
159 | # for all these modules. | |
b01ee67c WN |
160 | cpp-srcs-left := $(binaries-benchset:=.c) $(binaries-bench:=.c) \ |
161 | $(binaries-bench-malloc:=.c) | |
4856bcd2 | 162 | lib := nonlib |
2bfdaedd | 163 | include $(patsubst %,$(..)libof-iterator.mk,$(cpp-srcs-left)) |
4856bcd2 | 164 | |
43fe811b | 165 | bench-deps := bench-skeleton.c bench-timing.h Makefile |
acb4325f | 166 | |
8fc1bee5 | 167 | run-bench = $(test-wrapper-env) \ |
8540f6d2 | 168 | $(run-program-env) \ |
87da630b | 169 | $($*-ENV) $(test-via-rtld-prefix) $${run} |
8fc1bee5 | 170 | |
cb5e4aad SP |
171 | timing-type := $(objpfx)bench-timing-type |
172 | ||
a2964074 SP |
173 | bench-clean: |
174 | rm -f $(binaries-bench) $(addsuffix .o,$(binaries-bench)) | |
c1f75dc3 | 175 | rm -f $(binaries-benchset) $(addsuffix .o,$(binaries-benchset)) |
b01ee67c | 176 | rm -f $(binaries-bench-malloc) $(addsuffix .o,$(binaries-bench-malloc)) |
cb5e4aad | 177 | rm -f $(timing-type) $(addsuffix .o,$(timing-type)) |
d7aea0cf | 178 | rm -f $(addprefix $(objpfx),$(bench-extra-objs)) |
c1f75dc3 | 179 | |
0422ed1e VR |
180 | # Validate the passed in BENCHSET |
181 | ifneq ($(strip ${BENCHSET}),) | |
182 | VALIDBENCHSETNAMES := bench-pthread bench-math bench-string string-benchset \ | |
183 | wcsmbs-benchset stdlib-benchset stdio-common-benchset math-benchset \ | |
3904fd85 | 184 | malloc-thread malloc-simple |
0422ed1e VR |
185 | INVALIDBENCHSETNAMES := $(filter-out ${VALIDBENCHSETNAMES},${BENCHSET}) |
186 | ifneq (${INVALIDBENCHSETNAMES},) | |
187 | $(info The following values in BENCHSET are invalid: ${INVALIDBENCHSETNAMES}) | |
188 | $(info The valid ones are: ${VALIDBENCHSETNAMES}) | |
189 | $(error Invalid BENCHSET value) | |
190 | endif | |
191 | endif | |
192 | ||
2d304f3c | 193 | bench: bench-build bench-set bench-func bench-malloc |
8ce8299f | 194 | |
2d304f3c SP |
195 | # Target to only build the benchmark without running it. We generate locales |
196 | # only if we're building natively. | |
197 | ifeq (no,$(cross-compiling)) | |
198 | bench-build: $(gen-locales) $(timing-type) $(binaries-bench) \ | |
199 | $(binaries-benchset) $(binaries-bench-malloc) | |
200 | else | |
201 | bench-build: $(timing-type) $(binaries-bench) $(binaries-benchset) \ | |
202 | $(binaries-bench-malloc) | |
203 | endif | |
c1f75dc3 SP |
204 | |
205 | bench-set: $(binaries-benchset) | |
206 | for run in $^; do \ | |
207 | echo "Running $${run}"; \ | |
208 | $(run-bench) > $${run}.out; \ | |
209 | done | |
a2964074 | 210 | |
b01ee67c | 211 | bench-malloc: $(binaries-bench-malloc) |
0422ed1e | 212 | for run in $^; do \ |
3904fd85 WD |
213 | echo "$${run}"; \ |
214 | if [ `basename $${run}` = "bench-malloc-thread" ]; then \ | |
0422ed1e VR |
215 | for thr in 1 8 16 32; do \ |
216 | echo "Running $${run} $${thr}"; \ | |
3904fd85 WD |
217 | $(run-bench) $${thr} > $${run}-$${thr}.out; \ |
218 | done;\ | |
219 | else \ | |
220 | for thr in 8 16 32 64 128 256 512 1024 2048 4096; do \ | |
221 | echo "Running $${run} $${thr}"; \ | |
222 | $(run-bench) $${thr} > $${run}-$${thr}.out; \ | |
223 | done;\ | |
224 | fi;\ | |
b01ee67c WN |
225 | done |
226 | ||
cb5e4aad SP |
227 | # Build and execute the benchmark functions. This target generates JSON |
228 | # formatted bench.out. Each of the programs produce independent JSON output, | |
229 | # so one could even execute them individually and process it using any JSON | |
230 | # capable language or tool. | |
c1f75dc3 | 231 | bench-func: $(binaries-bench) |
0422ed1e | 232 | if [ -n '$^' ] ; then \ |
92ce43ee JM |
233 | { timing_type=$$($(test-wrapper-env) \ |
234 | $(run-program-env) \ | |
235 | $(test-via-rtld-prefix) \ | |
236 | $(timing-type)); \ | |
0422ed1e VR |
237 | echo "{\"timing_type\": \"$${timing_type}\","; \ |
238 | echo " \"functions\": {"; \ | |
239 | for run in $^; do \ | |
240 | if ! [ "x$${run}" = "x$<" ]; then \ | |
241 | echo ","; \ | |
242 | fi; \ | |
243 | echo "Running $${run}" >&2; \ | |
244 | $(run-bench) $(DETAILED_OPT); \ | |
245 | done; \ | |
246 | echo; \ | |
247 | echo " }"; \ | |
248 | echo "}"; \ | |
249 | } > $(objpfx)bench.out-tmp; \ | |
250 | if [ -f $(objpfx)bench.out ]; then \ | |
251 | mv -f $(objpfx)bench.out $(objpfx)bench.out.old; \ | |
cb5e4aad | 252 | fi; \ |
0422ed1e VR |
253 | mv -f $(objpfx)bench.out-tmp $(objpfx)bench.out; \ |
254 | $(PYTHON) scripts/validate_benchout.py $(objpfx)bench.out \ | |
255 | scripts/benchout.schema.json; \ | |
256 | fi | |
8fc1bee5 | 257 | |
b5ffdc48 FW |
258 | ifeq ($(bind-now),yes) |
259 | link-bench-bind-now = -Wl,-z,now | |
260 | endif | |
261 | ||
262 | bench-link-targets = $(timing-type) $(binaries-bench) $(binaries-benchset) \ | |
263 | $(binaries-bench-malloc) | |
264 | ||
265 | $(bench-link-targets): %: %.o $(objpfx)json-lib.o \ | |
009ba649 | 266 | $(link-extra-libs-tests) \ |
8fc1bee5 SP |
267 | $(sort $(filter $(common-objpfx)lib%,$(link-libc))) \ |
268 | $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) | |
87da630b | 269 | $(+link-tests) |
8fc1bee5 | 270 | |
b5ffdc48 FW |
271 | $(bench-link-targets): LDFLAGS += $(link-bench-bind-now) |
272 | ||
acb4325f | 273 | $(objpfx)bench-%.c: %-inputs $(bench-deps) |
8fc1bee5 SP |
274 | { if [ -n "$($*-INCLUDE)" ]; then \ |
275 | cat $($*-INCLUDE); \ | |
276 | fi; \ | |
67fc5637 | 277 | $(PYTHON) scripts/bench.py $(patsubst %-inputs,%,$<); } > $@-tmp |
8fc1bee5 | 278 | mv -f $@-tmp $@ |