Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add option to separate debug information (DWARF) from executable (#1973)
When building Debug or RelWithDebInfo, the size of the binaries (i.e. `stablehlo-opt`) can be quite beefy. I noticed it can be up to **2GiB** in size and attaching GDB is quite slow -- in fact loading the process to run is slow. _This is much larger and noticeable than the Bazel build._ This change introduces a common idiom to speed up large binaries by separating the debug information (DWARF) into separate files (`*.dwo). In order to speedup GDB attachment, a gdb-index is created and stored in the file itself. One could achieve the same effect with `.gdbinit` settings however the management of the index files are never pruned and it's a bit cumbersome to rely on developers to set it up. For reference here is a possible `.gdbinit` ``` # History. set history filename ~/.gdb_history set history save on set history size 100000 # Makes multiple invocations much faster set index-cache on # Allow per-project gdbinit files set auto-load local-gdbinit on add-auto-load-safe-path / ``` **Note**: Looks like you also need to build MLIR with separate dwarfs as well. To be honest, the interplay between settings on LLVM and then on StableHLO are not very clear at times. Some settings seem to propagate based on how the previous object code was created and others did not. Specifically for GDB launch, you can see a very big time saving in the below benchmark. **76s vs 1.3s** ## Inline debug info **Size**: 3.2GiB ```shell ❯ ll -h bin/stablehlo-opt Permissions Size User Date Modified Name .rwxr-xr-x 3.2G 780412 31 Jan 18:14 bin/stablehlo-opt ``` Most of the space is the debug information. ```shell ❯ /google/bin/releases/protobuf-team/bloaty/bloaty bin/stablehlo-opt --allow_unsafe_non_google3_input FILE SIZE VM SIZE -------------- -------------- 60.2% 1.80Gi 0.0% 0 .debug_info 12.4% 378Mi 0.0% 0 .debug_str 10.3% 314Mi 0.0% 0 .debug_loclists 5.9% 180Mi 0.0% 0 .debug_line ``` **Benchmark** ``` # benchmark just running the build ❯ hyperfine './build/bin/stablehlo-opt --version' Benchmark 1: ./build/bin/stablehlo-opt --version Time (mean ± σ): 181.6 ms ± 3.8 ms [User: 73.4 ms, System: 108.2 ms] Range (min … max): 173.8 ms … 188.3 ms 16 runs # benchark with GDB ❯ hyperfine 'gdb -ex run --args ./build/bin/stablehlo-opt --version' --warmup 1 --runs 3 Benchmark 1: gdb -ex run --args ./build/bin/stablehlo-opt --version Time (mean ± σ): 74.063 s ± 2.381 s [User: 71.044 s, System: 3.958 s] Range (min … max): 72.361 s … 76.784 s 3 runs ``` ## With separate debug info **Size**: 847M ```shell ❯ ll -h build/bin/stablehlo-opt Permissions Size User Date Modified Name .rwxr-xr-x 847M 780412 31 Jan 17:29 build/bin/stablehlo-opt ```` Much of the space is now a `gdb-index` to make attaching to the debugger much faster ```shell ❯ /google/bin/releases/protobuf-team/bloaty/bloaty build/bin/stablehlo-opt --allow_unsafe_non_google3_input FILE SIZE VM SIZE -------------- -------------- 38.0% 306Mi 0.0% 0 .gdb_index 24.2% 195Mi 0.0% 0 .debug_addr 20.6% 166Mi 0.0% 0 .debug_line 6.5% 52.5Mi 55.5% 52.5Mi .text ``` **Benchark**: ``` # benchmark just running the build ❯ hyperfine './build/bin/stablehlo-opt --version' Benchmark 1: ./build/bin/stablehlo-opt --version Time (mean ± σ): 38.6 ms ± 1.6 ms [User: 15.7 ms, System: 23.1 ms] Range (min … max): 36.5 ms … 44.6 ms 68 runs # benchark with GDB ❯ hyperfine 'gdb -ex run --args ./build/bin/stablehlo-opt --version' Benchmark 1: gdb -ex run --args ./build/bin/stablehlo-opt --version Time (mean ± σ): 1.401 s ± 0.037 s [User: 1.532 s, System: 0.883 s] Range (min … max): 1.345 s … 1.445 s 10 runs ```
- Loading branch information