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

[SYCL] Fix uncaught exceptions and null dereference #15173

Merged
merged 12 commits into from
Sep 4, 2024

Conversation

bso-intel
Copy link
Contributor

Added proper handling of exceptions propagated to the outermost level.

@bso-intel bso-intel changed the title [SYCL] Fix uncaught exceptions and null deference [SYCL] Fix uncaught exceptions and null dereference Aug 22, 2024
sycl/source/detail/image_impl.hpp Outdated Show resolved Hide resolved
sycl/source/event.cpp Outdated Show resolved Hide resolved
sycl/source/detail/graph_impl.cpp Outdated Show resolved Hide resolved
sycl/source/detail/graph_impl.cpp Outdated Show resolved Hide resolved
sycl/source/detail/global_handler.cpp Show resolved Hide resolved
sycl/source/detail/device_image_impl.hpp Show resolved Hide resolved
sycl/source/detail/device_image_impl.hpp Show resolved Hide resolved
sycl/source/detail/image_impl.hpp Outdated Show resolved Hide resolved
sycl/source/event.cpp Outdated Show resolved Hide resolved
sycl/source/detail/device_image_impl.hpp Show resolved Hide resolved
@bso-intel
Copy link
Contributor Author

@dm-vodopyanov
I think I addressed all your feedback.

@bso-intel
Copy link
Contributor Author

@dm-vodopyanov
gentle ping

sycl/source/detail/global_handler.cpp Outdated Show resolved Hide resolved
sycl/source/detail/graph_impl.cpp Outdated Show resolved Hide resolved
@bso-intel
Copy link
Contributor Author

@intel/llvm-gatekeepers
Please merge.

@bso-intel
Copy link
Contributor Author

@intel/llvm-gatekeepers
Please merge.

@bso-intel bso-intel changed the title [SYCL] Fix uncaught exceptions and null dereference [DO NOT MERGE][SYCL] Fix uncaught exceptions and null dereference Sep 3, 2024
@bso-intel bso-intel changed the title [DO NOT MERGE][SYCL] Fix uncaught exceptions and null dereference [SYCL] Fix uncaught exceptions and null dereference Sep 3, 2024
@againull againull merged commit fad405c into intel:sycl Sep 4, 2024
13 checks passed
@bso-intel bso-intel deleted the coverity branch September 4, 2024 01:43
Comment on lines +241 to +246
size_t size() const noexcept try {
return MRange.size();
} catch (std::exception &e) {
__SYCL_REPORT_EXCEPTION_TO_STREAM("exception in size", e);
std::abort();
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Changes like this look weird to me and I think that we may need some spec changes here to avoid them. Tagging @gmlueck here for awareness/feedback.

The only meaningful exception I would expect to see from range::size() is something like overflow_error, but at the same time we expect this type to be used on device (as a return type of various nd_item/group-related APIs) and exceptions are not supported in there.

Changing definition of the method between host and device compilation seems hacky, so I assume that the SYCL spec can only have one definition. And I think that that definition should be noexcept.

Reason behind our implementation throwing from range::size():

  • range inherits from detail::common_array to store data
  • range::size uses detail::common_array::operator[] to access that data
  • detail::common_array::operator[] contains a call to check_dimensions which throws if index is out of range [0..2], but does that only on host

I would also explore if we should turn runtime check in detail::common_array::check_dimensions into an assert. Even though values we pass there could pass directly from user (via id::operator[] for example), the SYCL spec is not clear what happens if we use an invalid dimension here. KhronosGroup/SYCL-Docs#551 is related, but there is no conclusion.

Copy link
Contributor

Choose a reason for hiding this comment

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

The change here seems unnecessary. Even without this change, if an exception is thrown in the body of size, the application will terminate. That's the semantics of the noexcept keyword. See cppreference:

Non-throwing functions are permitted to call potentially-throwing functions. Whenever an exception is thrown and the search for a handler encounters the outermost block of a non-throwing function, the function std::terminate is called

Copy link
Contributor

Choose a reason for hiding this comment

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

The change here seems unnecessary. Even without this change, if an exception is thrown in the body of size, the application will terminate.

My understanding is that one of our code coverage tools complains about throw in noexcept function and we are unable to ignore that by some reason. It is probably a good notification for us to review associated code to see if we can actually make it noexcept, but otherwise I don't think that its the end of the world. All those catch block should almost always be unreachable as I understand it.

Copy link
Contributor

Choose a reason for hiding this comment

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

I've submitted KhronosGroup/SYCL-Docs#626 to see if we want to mark all methods of range/id/other similar classes as noexcept in the SYCL spec so that we can clean up our code here.

AlexeySachkov pushed a commit to AlexeySachkov/llvm that referenced this pull request Nov 26, 2024
Added proper handling of exceptions propagated to the outermost level.

---------

Co-authored-by: Dmitry Vodopyanov <[email protected]>
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.

6 participants