Em Tue, Jul 28, 2020 at 08:51:52AM -0300, Arnaldo Carvalho de Melo escreveu: > Em Fri, Jul 24, 2020 at 12:19:59AM -0700, Ian Rogers escreveu: > > for_each_set_bit, or similar functions like for_each_cpu, may be hot > > within the kernel. If many bits were set then one could imagine on > > Intel a "bt" instruction with every bit may be faster than the function > > call and word length find_next_bit logic. Add a benchmark to measure > > this. > > Thanks, applied. > > - Arnaldo > > > This benchmark on AMD rome and Intel skylakex shows "bt" is not a good > > option except for very small bitmaps.
> > +++ b/tools/perf/bench/find-bit-bench.c > > +#if defined(__i386__) || defined(__x86_64__) > > +static bool asm_test_bit(long nr, const unsigned long *addr) > > +{ > > + bool oldbit; > > + > > + asm volatile("bt %2,%1" > > + : "=@ccc" (oldbit) > > + : "m" (*(unsigned long *)addr), "Ir" (nr) : "memory"); > > + > > + return oldbit; Some old clang versions are not liking this: clang version 3.8.0 (tags/RELEASE_380/final) Target: x86_64-alpine-linux-musl Thread model: posix InstalledDir: /usr/bin Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/5.3.0 Found candidate GCC installation: /usr/lib/gcc/x86_64-alpine-linux-musl/5.3.0 Selected GCC installation: /usr/bin/../lib/gcc/x86_64-alpine-linux-musl/5.3.0 Candidate multilib: .;@m64 Selected multilib: .;@m64 + make ARCH= CROSS_COMPILE= EXTRA_CFLAGS= -C /git/linux/tools/perf O=/tmp/build/perf CC=clang CC /tmp/build/perf/trace/beauty/pkey_alloc.o CC /tmp/build/perf/tests/openat-syscall-tp-fields.o bench/find-bit-bench.c:46:10: error: invalid output constraint '=@ccc' in asm : "=@ccc" (oldbit) ^ 1 error generated. mv: can't rename '/tmp/build/perf/bench/.find-bit-bench.o.tmp': No such file or directory /git/linux/tools/build/Makefile.build:96: recipe for target '/tmp/build/perf/bench/find-bit-bench.o' failed make[4]: *** [/tmp/build/perf/bench/find-bit-bench.o] Error 1 /git/linux/tools/build/Makefile.build:139: recipe for target 'bench' failed make[3]: *** [bench] Error 2 make[3]: *** Waiting for unfinished jobs.... MKDIR /tmp/build/perf/arch/x86/tests/ Also: clang version 3.8.1 (tags/RELEASE_381/final) clang version 4.0.0 (tags/RELEASE_400/final) - Arnaldo