mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-09-24 21:20:11 +01:00
The `libpfm` in the Bazel central repository uses `make` to build it, which is difficult to integrate with our toolchain. Rather than try to fix all the issues there, it's easy to just add a native Bazel build for the library. I don't know that any of the relevant upstream folks are interested in this kind of build, but it seems easy for us to maintain as a Carbon project build configuration. I've also not tried to port all of the different configurations as a consequence, and only 64-bit x86 and Arm as that seems the only likely architectures we'll care about in the near term. I've kept this using the `bzlmod` stuff as best I can, and I *think* I'm holding all of those pieces correctly, but if not, happy for suggestions on adjustments. The `google_benchmark` package also has an awkward way of enabling `libpfm` support using a top-level `bazel` command line flag. I think this is because of how brittle the Bazel build of `libpfm` is, but I'm not sure. With the new build, it seems easy to patch `google_benchmark` to detect the same conditions as we build `libpfm` under, and enable it there. So I've done this to avoid folks having to pass a command line flag on platforms where it is supported. The result is that we now get really nice CPU counter support in our benchmarks out-of-the-box on Linux x86-64 and AArch64. For example on my Fedora Asahi install on a Mac Mini I get: ```console $ bazel run -c opt --copt=-gmlt //common:hashing_benchmark --run_under="taskset -c 4" -- --benchmark_counters_tabular=true --benchmark_perf_counters=CYCLES,INSTRUCTIONS INFO: Invocation ID: 4aaeb9e9-7df5-4f1f-b56b-c03411790268 INFO: Analyzed target //common:hashing_benchmark (0 packages loaded, 0 targets configured). INFO: Found 1 target... Target //common:hashing_benchmark up-to-date: bazel-bin/common/hashing_benchmark INFO: Elapsed time: 0.360s, Critical Path: 0.02s INFO: 1 process: 1 internal. INFO: Build completed successfully, 1 total action INFO: Running command line: /bin/bash -c 'taskset -c 4 bazel-bin/common/hashing_benchmark '\''--benchmark_counters_tabular=true'\'' '\''--benchmark_perf_counters=CYCLES,INSTRUCTIONS'\''' 2024-01-15T00:10:50-08:00 Running /home/chandlerc/.cache/bazel/_bazel_chandlerc/b686aa8910e0845b88c21d715819b076/execroot/_main/bazel-out/aarch64-opt/bin/common/hashing_benchmark Run on (8 X 2064 MHz CPU s) CPU Caches: L1 Data 64 KiB (x8) L1 Instruction 128 KiB (x8) L2 Unified 4096 KiB (x2) Load Average: 0.01, 0.08, 0.08 -------------------------------------------------------------------------------------------------------------------------------------------------------------- Benchmark Time CPU Iterations CYCLES INSTRUCTIONS bytes_per_second -------------------------------------------------------------------------------------------------------------------------------------------------------------- BM_LatencyHash<RandValues<uint8_t>, CarbonHashBench> 4.11 ns 4.11 ns 170200064 13.1321 9.00587 232.116Mi/s BM_LatencyHash<RandValues<uint8_t>, AbseilHashBench> 4.82 ns 4.82 ns 145643520 15.3657 12.0059 197.946Mi/s BM_LatencyHash<RandValues<uint8_t>, LLVMHashBench> 7.96 ns 7.95 ns 87956480 25.3737 17.0068 119.991Mi/s BM_LatencyHash<RandValues<uint16_t>, CarbonHashBench> 4.11 ns 4.11 ns 170365952 13.1247 9.00587 464.573Mi/s BM_LatencyHash<RandValues<uint16_t>, AbseilHashBench> 5.51 ns 5.51 ns 127568896 17.5578 14.0059 346.225Mi/s BM_LatencyHash<RandValues<uint16_t>, LLVMHashBench> 8.00 ns 7.99 ns 87085056 25.377 17.0068 238.834Mi/s BM_LatencyHash<RandValues<std::pair<uint8_t, uint8_t>>, CarbonHashBench> 4.91 ns 4.90 ns 136013824 15.6456 14.0059 389.006Mi/s BM_LatencyHash<RandValues<std::pair<uint8_t, uint8_t>>, AbseilHashBench> 6.85 ns 6.85 ns 102630400 21.8041 18.0059 278.637Mi/s BM_LatencyHash<RandValues<std::pair<uint8_t, uint8_t>>, LLVMHashBench> 7.57 ns 7.56 ns 92798976 24.1437 20.0068 252.151Mi/s BM_LatencyHash<RandValues<uint32_t>, CarbonHashBench> 4.12 ns 4.12 ns 170229760 13.1272 9.00587 926.444Mi/s BM_LatencyHash<RandValues<uint32_t>, AbseilHashBench> 4.93 ns 4.92 ns 145304576 15.3738 12.0059 775.224Mi/s BM_LatencyHash<RandValues<uint32_t>, LLVMHashBench> 8.11 ns 8.10 ns 87127040 25.373 17.0068 470.98Mi/s ```