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

Apply extended robust access on global buffer access #2874

Merged
merged 1 commit into from
Dec 20, 2023

Conversation

xuechen417
Copy link
Contributor

@xuechen417 xuechen417 commented Dec 11, 2023

This change will perform defined behavior for global buffer access in
the case of null descriptor or out-of-bound if the application need the
extended robustnessAccess.
NOTE: we use dword2 to check null descriptor.

@xuechen417 xuechen417 requested a review from a team as a code owner December 11, 2023 06:31
@amdvlk-admin
Copy link
Collaborator

Test summary for commit d339caf

CTS tests (Failed: 0/138443)
  • Built with version 1.3.5.2
  • Ubuntu navi3x, Srdcvk
    • Passed: 35211/69228 (50.9%)
    • Failed: 0/69228 (0.0%)
    • Not Supported: 34017/69228 (49.1%)
    • Warnings: 0/69228 (0.0%)
    Ubuntu navi2x, Srdcvk
    • Passed: 35241/69215 (50.9%)
    • Failed: 0/69215 (0.0%)
    • Not Supported: 33974/69215 (49.1%)
    • Warnings: 0/69215 (0.0%)

Copy link
Member

@nhaehnle nhaehnle left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! The general flow of this makes sense to me, though I do have a couple of comments.

Typo in the title: *descriptor

We have some freedom in how we choose to lower the various access and bounds checks. The pre-existing code avoids the branch by overriding the offset check, which makes a lot of sense in general, but perhaps not so much when we have a branch anyway: the bounds check could become part of the branch check. Have you thought through the implications?

It's not actually clear that this is always an improvement. In particular, what happens if we have a sequence of related loads and stores to/from the same buffer? Can we optimize that somehow?

These two points are something for you to think about if you haven't yet, though they don't necessarily have to affect this PR.

lgc/patch/PatchBufferOp.cpp Outdated Show resolved Hide resolved
lgc/patch/PatchBufferOp.cpp Outdated Show resolved Hide resolved
lgc/patch/PatchBufferOp.cpp Outdated Show resolved Hide resolved
@xuechen417
Copy link
Contributor Author

We have some freedom in how we choose to lower the various access and bounds checks. The pre-existing code avoids the branch by overriding the offset check, which makes a lot of sense in general, but perhaps not so much when we have a branch anyway: the bounds check could become part of the branch check. Have you thought through the implications?

The pre-existing code by overriding the offset as 0 cannot work well for both null descriptor and out-of-bound. I will merge the oob and null desc as the branch check as you said. I have two concerns:

  • Is it enough to check dword2 to deduce whether it is an invalid access (null desc or oob)?If not, I will use dword2 and dword3 for oob and null desc, respectively.
  • We use ExtendedRobustness::robustBufferAccess to give defined hehavior (read 0, discard write) for oob. Should we always do the defined hehavior no matter this flag is enabled?

It's not actually clear that this is always an improvement. In particular, what happens if we have a sequence of related loads and stores to/from the same buffer? Can we optimize that somehow?

Yes, the branch will impact the optimization on merging a sequence of loads/stores. Unfortunately, We have to add it to ensure correct behavior in the case of null descriptor allowed. This pr is to resolve a TDR issue in DX app due to accessing null descriptor.

@xuechen417
Copy link
Contributor Author

V1: renaming createGlobalPointerAccess and use SplitBlockAndInsertIfThen

@amdvlk-admin
Copy link
Collaborator

Test summary for commit 586f50b

CTS tests (Failed: 134/138378)
  • Built with version 1.3.5.2
  • Ubuntu navi3x, Srdcvk
    • Passed: 35095/69163 (50.7%)
    • Failed: 67/69163 (0.1%)

      Failures:

      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer.compute.multiple_discontiguous_descriptors.offset_view_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer_dynamic.fragment.descriptor_array.offset_view_zero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer_dynamic.geometry.multiple_descriptor_sets.descriptor_array.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer_dynamic.tess_ctrl.multiple_descriptor_sets.multiple_contiguous_descriptors.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer_dynamic.tess_eval.multiple_descriptor_sets.multiple_contiguous_descriptors.offset_view_zero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.uniform_buffer_dynamic.geometry.multiple_arbitrary_descriptors.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.uniform_buffer_dynamic.tess_ctrl.multiple_discontiguous_descriptor_sets.multiple_arbitrary_descriptors.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.uniform_buffer_dynamic.vertex_fragment.multiple_arbitrary_descriptors.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_push.storage_buffer.tess_ctrl.multiple_arbitrary_descriptors.offset_view_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.storage_buffer_dynamic.tess_ctrl.descriptor_array.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.storage_buffer_dynamic.tess_eval.multiple_descriptor_sets.multiple_arbitrary_descriptors.offset_view_zero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.storage_buffer_dynamic.vertex.multiple_descriptor_sets.multiple_arbitrary_descriptors.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.uniform_buffer_dynamic.geometry.multiple_discontiguous_descriptor_sets.multiple_arbitrary_descriptors.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.uniform_buffer_dynamic.vertex.multiple_descriptor_sets.descriptor_array.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer.tess_eval.multiple_discontiguous_descriptor_sets.multiple_contiguous_descriptors.offset_view_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer_dynamic.fragment.multiple_descriptor_sets.multiple_discontiguous_descriptors.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer_dynamic.geometry.multiple_arbitrary_descriptors.offset_view_zero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer_dynamic.geometry.multiple_descriptor_sets.descriptor_array.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer_dynamic.tess_ctrl.multiple_discontiguous_descriptor_sets.multiple_contiguous_descriptors.offset_view_nonzero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.uniform_buffer.geometry.multiple_descriptor_sets.multiple_contiguous_descriptors.offset_view_nonzero
      Stack trace: Fail
      ...
      

    • Not Supported: 34001/69163 (49.2%)
    • Warnings: 0/69163 (0.0%)
    Ubuntu navi2x, Srdcvk
    • Passed: 35175/69215 (50.8%)
    • Failed: 67/69215 (0.1%)

      Failures:

      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer.compute.multiple_discontiguous_descriptors.offset_view_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer_dynamic.fragment.descriptor_array.offset_view_zero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer_dynamic.geometry.multiple_descriptor_sets.descriptor_array.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer_dynamic.tess_ctrl.multiple_descriptor_sets.multiple_contiguous_descriptors.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.storage_buffer_dynamic.tess_eval.multiple_descriptor_sets.multiple_contiguous_descriptors.offset_view_zero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.uniform_buffer_dynamic.geometry.multiple_arbitrary_descriptors.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.uniform_buffer_dynamic.tess_ctrl.multiple_discontiguous_descriptor_sets.multiple_arbitrary_descriptors.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.uniform_buffer_dynamic.vertex_fragment.multiple_arbitrary_descriptors.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_push.storage_buffer.tess_ctrl.multiple_arbitrary_descriptors.offset_view_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.storage_buffer_dynamic.tess_ctrl.descriptor_array.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.storage_buffer_dynamic.tess_eval.multiple_descriptor_sets.multiple_arbitrary_descriptors.offset_view_zero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.storage_buffer_dynamic.vertex.multiple_descriptor_sets.multiple_arbitrary_descriptors.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.uniform_buffer_dynamic.geometry.multiple_discontiguous_descriptor_sets.multiple_arbitrary_descriptors.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.primary_cmd_buf.with_template.uniform_buffer_dynamic.vertex.multiple_descriptor_sets.descriptor_array.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer.tess_eval.multiple_discontiguous_descriptor_sets.multiple_contiguous_descriptors.offset_view_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer_dynamic.fragment.multiple_descriptor_sets.multiple_discontiguous_descriptors.offset_view_nonzero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer_dynamic.geometry.multiple_arbitrary_descriptors.offset_view_zero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer_dynamic.geometry.multiple_descriptor_sets.descriptor_array.offset_view_zero_dynamic_zero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.storage_buffer_dynamic.tess_ctrl.multiple_discontiguous_descriptor_sets.multiple_contiguous_descriptors.offset_view_nonzero_dynamic_nonzero
      Stack trace: Fail
      
      FAILURE: dEQP-VK.binding_model.shader_access.secondary_cmd_buf.uniform_buffer.geometry.multiple_descriptor_sets.multiple_contiguous_descriptors.offset_view_nonzero
      Stack trace: Fail
      ...
      

    • Not Supported: 33973/69215 (49.1%)
    • Warnings: 0/69215 (0.0%)

@xuechen417
Copy link
Contributor Author

V2: fix tests failing.

@xuechen417 xuechen417 force-pushed the nullDesc branch 2 times, most recently from 7d87f10 to c2ed376 Compare December 12, 2023 08:10
@ruiling
Copy link
Contributor

ruiling commented Dec 12, 2023

It's not actually clear that this is always an improvement. In particular, what happens if we have a sequence of related loads and stores to/from the same buffer? Can we optimize that somehow?

Running LoadStoreVectorizer before PatchBufferOp may help on part of this. To further improve that, we may need rework of PatchBufferOp to allow lowering a group of instructions, but it seems nontrivial effort.

@amdvlk-admin
Copy link
Collaborator

Test summary for commit 7d87f10

CTS tests (Failed: 0/138378)
  • Built with version 1.3.5.2
  • Ubuntu navi3x, Srdcvk
    • Passed: 35162/69163 (50.8%)
    • Failed: 0/69163 (0.0%)
    • Not Supported: 34001/69163 (49.2%)
    • Warnings: 0/69163 (0.0%)
    Ubuntu navi2x, Srdcvk
    • Passed: 35242/69215 (50.9%)
    • Failed: 0/69215 (0.0%)
    • Not Supported: 33973/69215 (49.1%)
    • Warnings: 0/69215 (0.0%)

@amdvlk-admin
Copy link
Collaborator

Test summary for commit c2ed376

CTS tests (Failed: 0/138378)
  • Built with version 1.3.5.2
  • Ubuntu navi3x, Srdcvk
    • Passed: 35162/69163 (50.8%)
    • Failed: 0/69163 (0.0%)
    • Not Supported: 34001/69163 (49.2%)
    • Warnings: 0/69163 (0.0%)
    Ubuntu navi2x, Srdcvk
    • Passed: 35241/69215 (50.9%)
    • Failed: 0/69215 (0.0%)
    • Not Supported: 33974/69215 (49.1%)
    • Warnings: 0/69215 (0.0%)

@nhaehnle
Copy link
Member

We use ExtendedRobustness::robustBufferAccess to give defined hehavior (read 0, discard write) for oob. Should we always do the defined hehavior no matter this flag is enabled?

Applications which don't need the extended robustBufferAccess should not have to pay the performance price.

@nhaehnle
Copy link
Member

Is it enough to check dword2 to deduce whether it is an invalid access (null desc or oob)?If not, I will use dword2 and dword3 for oob and null desc, respectively.

Good point. Checking dword2 (num_records) is probably enough. At least, I can't think of a reason why it wouldn't be right now.

@xuechen417
Copy link
Contributor Author

V2: Use dword2 for null descriptor and add out-of-bound as the branch check if it is needed by the app.

@xuechen417 xuechen417 changed the title Handle null descritor for patching global buffer operations Apply extended robust access on global buffer access Dec 13, 2023
This change will perform defined behavior for global buffer access in
the case of null descriptor or out-of-bound if the application need the
extended `robustnessAccess`.
NOTE: we use dword2 to check null descriptor.
@Flakebi
Copy link
Member

Flakebi commented Dec 13, 2023

Did you push anything? :)

@xuechen417
Copy link
Contributor Author

Did you push anything? :)

Oops! Thanks for reminding. Finish pushing. Please help review.

@amdvlk-admin
Copy link
Collaborator

Test summary for commit 36c0717

CTS tests (Failed: 0/138443)
  • Built with version 1.3.5.2
  • Ubuntu navi3x, Srdcvk
    • Passed: 35211/69228 (50.9%)
    • Failed: 0/69228 (0.0%)
    • Not Supported: 34017/69228 (49.1%)
    • Warnings: 0/69228 (0.0%)
    Ubuntu navi2x, Srdcvk
    • Passed: 35241/69215 (50.9%)
    • Failed: 0/69215 (0.0%)
    • Not Supported: 33974/69215 (49.1%)
    • Warnings: 0/69215 (0.0%)

Copy link
Member

@nhaehnle nhaehnle left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, this LGTM.

lgc/patch/PatchBufferOp.cpp Show resolved Hide resolved
@xuechen417 xuechen417 merged commit 217a8e3 into GPUOpen-Drivers:dev Dec 20, 2023
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants