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

Consider boxing Error in wgsl parser. #4452

Open
jrmuizel opened this issue Dec 15, 2021 · 5 comments
Open

Consider boxing Error in wgsl parser. #4452

jrmuizel opened this issue Dec 15, 2021 · 5 comments
Labels
kind: refactor Making existing function faster or nicer naga Shader Translator

Comments

@jrmuizel
Copy link
Contributor

It looks like Error is 80 bytes on x86-64 which will make the Result<> returned from a lot of the lexing functions pretty big. A prototype of this reduced the size of naga::front::wgsl::Parser::parse from 24.2KiB to 21.9KiB. Unfortunately, because of rust-lang/rust#46607 the savings is not as much as it could be because every call to Box::new() ends up with an inlined test for a null return from _rust_alloc.

@kvark kvark added the kind: refactor Making existing function faster or nicer label Dec 16, 2021
@jrmuizel
Copy link
Contributor Author

Here are size profiles of parse_statement that show the impact of my prototype.

before: https://share.firefox.dev/3p6Jzol
after: https://share.firefox.dev/3J5De4s

@jrmuizel
Copy link
Contributor Author

A fun fact revealed by this is that around 5% of parse_statements code size is spent in StatementContext::as_expression. I don't think many people would've predicted that.

@kvark
Copy link
Member

kvark commented Dec 20, 2021

Interesting! Any explanation there? I'd expect as_expression to be mostly a user-level construct that disappears when compiling down to the actual code.
So are you getting convinced that boxing Error is the way to go?

@jrmuizel
Copy link
Contributor Author

as_expression is compiled down to a bunch of moves. It's a fairly big structure and is called a bunch so it adds up.

0x1001513d9: mov rcx, qword ptr [r15]    naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513dc: mov rdx, qword ptr [r15 + 8] naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513e0: mov r10, qword ptr [r15 + 0x28] naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513e4: mov r11, qword ptr [r15 + 0x30] naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513e8: mov rbx, qword ptr [r15 + 0x38] naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513ec: mov r8, qword ptr [r15 + 0x10] naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513f0: mov r9, qword ptr [r15 + 0x40] naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513f4: mov rsi, qword ptr [r15 + 0x48] naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513f8: mov rdi, qword ptr [r15 + 0x50] naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x1001513fc: mov qword ptr [rbp - 0x90], rcx naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x100151403: mov qword ptr [rbp - 0x88], rdx naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x10015140a: mov qword ptr [rbp - 0x80], rax naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x10015140e: mov qword ptr [rbp - 0x78], r10 naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x100151412: mov qword ptr [rbp - 0x70], r11 naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x100151416: mov qword ptr [rbp - 0x68], rbx naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x10015141a: mov qword ptr [rbp - 0x60], r8 naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x10015141e: mov qword ptr [rbp - 0x58], rsi naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x100151422: mov qword ptr [rbp - 0x50], rdi naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x100151426: mov qword ptr [rbp - 0x48], r9 naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x10015142a: mov qword ptr [rbp - 0x40], r12 naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x10015142e: lea rax, [rbp - 0x170]      naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x100151435: mov qword ptr [rbp - 0x38], rax naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x100151439: mov rbx, r12                naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c
0x10015143c: lea r12, [rbp - 0x90]       naga::front::wgsl::StatementContext::as_expression::h6d151787295027fb naga::front::wgsl::Parser::parse_statement::h9263f31b2d3df89c

I haven't tried to see what's preventing the moves from being elided, but it doesn't look like it'd necessarily be easy for the compiler to do because it's not just plain memcpy.

@kvark
Copy link
Member

kvark commented Dec 20, 2021

so much for trying to limit the amount of data we pass in... we could try just passing StatementContext everywhere instead and see

@cwfitzgerald cwfitzgerald transferred this issue from gfx-rs/naga Oct 25, 2023
@cwfitzgerald cwfitzgerald added the naga Shader Translator label Oct 25, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
kind: refactor Making existing function faster or nicer naga Shader Translator
Projects
None yet
Development

No branches or pull requests

3 participants