-
Notifications
You must be signed in to change notification settings - Fork 2k
[webgpu] Let vectorized binary op return an overridable value on NaN #7198
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
Conversation
This is like 2c95a67 [webgpu] Further tweak vectorized NaN handling in binary ops but for `valueForNaN`.
| const opFnStr = ` | ||
| fn binaryOperation(a : ${dType}, b : ${dType}) -> ${dType} { | ||
| let isNaN = false; | ||
| let valueForNaN = uniforms.NAN; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The op returns booleans, even for NaN operands. I think that's by design.
(Well, the doc says nothing about this, it's just explicitly checked in the unit tests. Another mess is that currently this is defined in NOT_EQUAL, but not in EQUAL!)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So do you think if uniforms.NAN is good enough for a default value? I'm not sure if we have more cases like (NOT_)EQUAL.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, I think so.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can't see any reason that we use let valueForNaN = 1.0; for NOT_EQUAL_VEC4. For WebGL, there is no NaN check for NotEqual.
So my opinion is we directly use uniforms.NAN in CHECK_NAN_SNIPPET_VEC4. And don't need to define an additional variable valueForNaN.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- WGSL implementations may assume that NaNs and infinities are not present at runtime. In such an implementation, when an expression evaluation would produce an infinity or a NaN, an indeterminate value of the target type is produced instead. So, I feel explicit checks are necessary.
- We want
i32(valueForNaN)to evaluate to 1/true later, buti32(uniforms.NAN)is 0/false.
This is like
2c95a67 [webgpu] Further tweak vectorized NaN handling in binary ops
but for
valueForNaN.To see the logs from the Cloud Build CI, please join either our discussion or announcement mailing list.
This change is