Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

rustc_codegen_spirv taking a long time processing my (large) shader #851

Open
hatoo opened this issue Feb 17, 2022 · 3 comments
Open

rustc_codegen_spirv taking a long time processing my (large) shader #851

hatoo opened this issue Feb 17, 2022 · 3 comments
Labels
t: bug Something isn't working

Comments

@hatoo
Copy link
Contributor

hatoo commented Feb 17, 2022

This issue is from Discord conversation https://discordapp.com/channels/750717012564770887/750717499737243679/943879544006381638

Expected Behaviour

I want to compile my shader faster.

Example & Steps To Reproduce

  1. clone my repo https://github.com/hatoo/rene
  2. cargo build --release -Z timings
  3. See compile duration

I tested on af3cf2b74e8ef4f4bd98a3cd2cda64b9379d20d7.

Completed rene v0.1.0 build script (run) in 263.2s

In console in VSCode and rust-analyzer plugin. It takes more time.

Completed rene v0.1.0 build script (run) in 407.3s

System Info

  • Rust: rustc 1.60.0-nightly (1bd4fdc94 2022-01-12)
  • OS: Windows 11
  • CPU: 3950X
  • GPU: RTX2080ti
  • SPIR-V: SPIRV-Tools v2021.4-dev v2021.3-86-g21e3f681
@hatoo hatoo added the t: bug Something isn't working label Feb 17, 2022
@hatoo
Copy link
Contributor Author

hatoo commented Feb 19, 2022

After I added codes to my shader, it takes very longer time to compile.
In this commit, it takes about 1000s.

Completed rene v0.1.0 build script (run) in 1009.6s

And I added one commit to this in this branch.
I've waited for few hours and the build didn't end.

@hatoo
Copy link
Contributor Author

hatoo commented Feb 20, 2022

I enabled -Zself-profile and build it and I found rustc is spending almost all time to link (link_block_ordering_pass_and_mem2reg).

Procedure

  1. Enable -Zself-profile on spirv-builder. It can be done by like hatoo@e34bda5
  2. Change rene's spirv-builder dependency to use it.
  3. cargo install --git https://github.com/rust-lang/measureme crox flamegraph summarize
  4. cargo build --release on rene
  5. crox .\rene_shader-xxxx.mm_profdata and chrome_profiler.json will be produced.
  6. Open Chrome Developper tool and click the Performance tab. And upload chrome_profiler.json by clicking ⬆️ button.

image

@eddyb
Copy link
Contributor

eddyb commented Jul 8, 2023

I've been working on a mem2reg replacement recently, relying on SPIR-T qptrs (based on EmbarkStudios/spirt#29 / EmbarkStudios/spirt#41 - no PR yet for the mem2reg replacement though, but I really hope I can get it into Rust-GPU 0.9, behind the qptr opt-in).

$ rg mem2reg 2023-07-08-spirt-disagg-baseline 
512:time:   0.011; rss:  187MB ->  187MB (   +0MB)      link_block_ordering_pass_and_mem2reg-before-inlining
515:time: 126.704; rss:  189MB ->  158MB (  -31MB)      link_block_ordering_pass_and_mem2reg-after-inlining
$ rg qptr::partition_and_propagate 2023-07-08-spirt-disagg-qptr-pnp 
538:time:   0.570; rss:  220MB ->  221MB (   +1MB)      qptr::partition_and_propagate

so that's a 222x speed-up (for the same version of rene-shader I used to demo the initial impact from SPIR-T, over a year ago)

(RUSTGPU_CODEGEN_ARGS="--spirt-passes=qptr --no-infer-storage-classes --no-legacy-mem2reg" is the opt-in, at least on my local branch, I'm hoping we can at least simplify it to RUSTGPU_CODEGEN_ARGS=--qptr for 0.9)

EDIT: to be perfectly clear: those flags are not useful without the necessary combination of SPIR-T + Rust-GPU changes and I don't even have an up-to-date Rust-GPU branch anywhere comparable to that one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
t: bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants