Repository: NVIDIA/cccl
Pull request #4373: [STF] Add support for codes which do not allow exceptions
Author: login: caugonnet
Labels: name: stf
description: Sequential Task Flow programming model
Created: 2025-04-08T13:31:45Z | Merged: 2025-04-09T08:15:12Z

## Description

We cannot use throw, catch or try if the --no-exceptions flag is set by the user

<!-- Provide a standalone description of changes in this PR. -->

<!-- Note: The pull request title will be included in the CHANGELOG. -->

## Checklist
<!-- TODO: - [ ] I am familiar with the [Contributing Guidelines](). -->
- [x] New or existing tests cover these changes.
- [x] The documentation is up to date with these changes.



Diff:
diff --git a/cudax/include/cuda/experimental/__stf/internal/context.cuh b/cudax/include/cuda/experimental/__stf/internal/context.cuh
index c9eacd8d310..439183c2460 100644
--- a/cudax/include/cuda/experimental/__stf/internal/context.cuh
+++ b/cudax/include/cuda/experimental/__stf/internal/context.cuh
@@ -791,7 +791,7 @@ public:
     }
     else
     {
-      throw ::std::runtime_error("Payload does not hold graph_ctx");
+      ::cuda::std::__throw_runtime_error("Payload does not hold graph_ctx");
     }
   }
 
diff --git a/cudax/include/cuda/experimental/__stf/utility/cuda_safe_call.cuh b/cudax/include/cuda/experimental/__stf/utility/cuda_safe_call.cuh
index c75ea984b6a..e73ce9d9281 100644
--- a/cudax/include/cuda/experimental/__stf/utility/cuda_safe_call.cuh
+++ b/cudax/include/cuda/experimental/__stf/utility/cuda_safe_call.cuh
@@ -323,7 +323,11 @@ void cuda_try(Status status, const _CUDA_VSTD::source_location loc = _CUDA_VSTD:
 {
   if (status)
   {
+#if _CCCL_HAS_EXCEPTIONS()
     throw cuda_exception(status, loc);
+#else // ^^^ _CCCL_HAS_EXCEPTIONS() ^^^ / vvv !_CCCL_HAS_EXCEPTIONS() vvv
+    _CUDA_VSTD_NOVERSION::terminate();
+#endif // !_CCCL_HAS_EXCEPTIONS()
   }
 }
 
diff --git a/cudax/include/cuda/experimental/__stf/utility/traits.cuh b/cudax/include/cuda/experimental/__stf/utility/traits.cuh
index f25edd15acc..e0a44a40272 100644
--- a/cudax/include/cuda/experimental/__stf/utility/traits.cuh
+++ b/cudax/include/cuda/experimental/__stf/utility/traits.cuh
@@ -25,6 +25,7 @@
 #  pragma system_header
 #endif // no system header
 
+#include <cuda/std/__utility/exception_guard.h>
 #include <cuda/std/mdspan>
 
 #include <cuda/experimental/__stf/utility/core.cuh>
@@ -365,27 +366,25 @@ auto all_convertible(P&&... p)
   unsigned char buffer[size * sizeof(T)];
   auto& result = *reinterpret_cast<::std::array<T, size>*>(&buffer[0]);
   size_t i     = 0; // marks the already-constructed portion of the array
-  try
-  {
-    each_in_pack(
-      [&](auto&& e) {
-        if constexpr (::std::is_convertible_v<decltype(e), T>)
-        {
-          new (result.data() + i) T(::std::forward<decltype(e)>(e));
-          ++i;
-        }
-      },
-      ::std::forward<P>(p)...);
-    return mv(result);
-  }
-  catch (...)
-  {
+
+  auto rollback = [&result, &i]() {
     for (size_t j = 0; j < i; ++j)
     {
       result[j].~T();
     }
-    throw;
-  }
+  };
+
+  auto __guard = _CUDA_VSTD::__make_exception_guard(rollback);
+  each_in_pack(
+    [&](auto&& e) {
+      if constexpr (::std::is_convertible_v<decltype(e), T>)
+      {
+        new (result.data() + i) T(::std::forward<decltype(e)>(e));
+        ++i;
+      }
+    },
+    ::std::forward<P>(p)...);
+  return mv(result);
 }
 
 /*
diff --git a/cudax/include/cuda/experimental/__stf/utility/unittest.cuh b/cudax/include/cuda/experimental/__stf/utility/unittest.cuh
index dd42fbdd9bd..bf743080f29 100644
--- a/cudax/include/cuda/experimental/__stf/utility/unittest.cuh
+++ b/cudax/include/cuda/experimental/__stf/utility/unittest.cuh
@@ -130,6 +130,17 @@ struct expecter
     }
   };
 
+  template <typename... Msgs>
+  [[noreturn]] static _LIBCUDACXX_HIDE_FROM_ABI void
+  __throw_stf_failure([[maybe_unused]] _CUDA_VSTD::source_location loc, [[maybe_unused]] const Msgs&... msgs)
+  {
+#  if _CCCL_HAS_EXCEPTIONS()
+    NV_IF_ELSE_TARGET(NV_IS_HOST, (throw failure(loc, msgs...);), (_CUDA_VSTD_NOVERSION::terminate();))
+#  else // ^^^ _CCCL_HAS_EXCEPTIONS() ^^^ / vvv !_CCCL_HAS_EXCEPTIONS() vvv
+    _CUDA_VSTD_NOVERSION::terminate();
+#  endif // !_CCCL_HAS_EXCEPTIONS()
+  }
+
   /*
    * @brief Wrapper for a comparison operation using one of `==`, `!=`, `<`, `>`, `<=`, `>=`. Includes the result and
    * the operands.
@@ -283,7 +294,7 @@ struct expecter
     if constexpr (sizeof...(msgs) == 0)
     {
       using U = ::std::remove_reference_t<T>;
-      throw failure(
+      __throw_stf_failure(
         loc,
         "Tested expression of type " + ::std::string(type_name<T>) + " is "
           + (std::is_same_v<const U, const bool> ? "false"
@@ -293,7 +304,7 @@ struct expecter
     }
     else
     {
-      throw failure(loc, msgs...);
+      __throw_stf_failure(loc, msgs...);
     }
   }
 
@@ -312,7 +323,7 @@ struct expecter
     {
       return ::std::forward<L>(e.lhs);
     }
-    throw failure(loc, e.lhs, ' ', e.op, ' ', e.rhs, " is false.\n", msgs...);
+    __throw_stf_failure(loc, e.lhs, ' ', e.op, ' ', e.rhs, " is false.\n", msgs...);
   }
 };
 
@@ -534,6 +545,10 @@ UNITTEST("EXPECT")
   EXPECT(1 + 1 == 2, "All we know about mathematics has been upended!"); // pass
   auto p = EXPECT(malloc(100) != nullptr); // pass, put the pointer to allocated memory in p
   free(p);
+
+  // This test is specifically about how we handle exceptions, so we disable it
+  // when exceptions are not allowed
+#  if _CCCL_HAS_EXCEPTIONS()
   try
   {
     EXPECT(41 == 102); // fail, will throw exception
@@ -543,6 +558,7 @@ UNITTEST("EXPECT")
     // The exception message will contain the actual numbers 41 and 102.
     EXPECT(::std::string_view(e.what()).find("41 == 102 is false") != ::std::string_view::npos);
   }
+#  endif // !_CCCL_HAS_EXCEPTIONS()
   //! [EXPECT]
 };
 


Reviews:
user: login: miscco
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T13:59:04Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T14:13:47Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T14:17:07Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T14:25:14Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:10:53Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-08T15:12:17Z
user: login: miscco
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T06:56:01Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T07:08:05Z
user: login: miscco
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-09T08:12:27Z

Review comments:
diff_hunk: @@ -791,7 +791,11 @@ public:
     }
     else
     {
+#ifndef _CCCL_NO_EXCEPTIONS
       throw ::std::runtime_error("Payload does not hold graph_ctx");
+#else // ^^^ !_CCCL_NO_EXCEPTIONS ^^^ / vvv _CCCL_NO_EXCEPTIONS vvv
+      _CUDA_VSTD_NOVERSION::terminate();
+#endif // _CCCL_NO_EXCEPTIONS
path: cudax/include/cuda/experimental/__stf/internal/context.cuh
user: login: miscco
body: this should be
```suggestion
     ::cuda::std::__throw_runtime_error("Payload does not hold graph_ctx");
```
created_at: 2025-04-08T13:55:31Z
author_association: CONTRIBUTOR
diff_hunk: @@ -312,7 +320,11 @@ struct expecter
     {
       return ::std::forward<L>(e.lhs);
     }
+#  ifndef _CCCL_NO_EXCEPTIONS
path: cudax/include/cuda/experimental/__stf/utility/unittest.cuh
user: login: miscco
body: I would prefer a `__throw_cudastf_failure` or whatever name fits
created_at: 2025-04-08T13:58:08Z
author_association: CONTRIBUTOR
diff_hunk: @@ -365,8 +365,10 @@ auto all_convertible(P&&... p)
   unsigned char buffer[size * sizeof(T)];
   auto& result = *reinterpret_cast<::std::array<T, size>*>(&buffer[0]);
   size_t i     = 0; // marks the already-constructed portion of the array
+#ifndef _CCCL_NO_EXCEPTIONS
path: cudax/include/cuda/experimental/__stf/utility/traits.cuh
user: login: miscco
body: This kind of code is best handled with an exception guard, see `__make_exception_guard`
created_at: 2025-04-08T13:59:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -791,7 +791,11 @@ public:
     }
     else
     {
+#ifndef _CCCL_NO_EXCEPTIONS
       throw ::std::runtime_error("Payload does not hold graph_ctx");
+#else // ^^^ !_CCCL_NO_EXCEPTIONS ^^^ / vvv _CCCL_NO_EXCEPTIONS vvv
+      _CUDA_VSTD_NOVERSION::terminate();
+#endif // _CCCL_NO_EXCEPTIONS
path: cudax/include/cuda/experimental/__stf/internal/context.cuh
user: login: caugonnet
body: Thanks !!
created_at: 2025-04-08T14:13:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -323,7 +323,11 @@ void cuda_try(Status status, const _CUDA_VSTD::source_location loc = _CUDA_VSTD:
 {
   if (status)
   {
+#ifndef _CCCL_NO_EXCEPTIONS
     throw cuda_exception(status, loc);
path: cudax/include/cuda/experimental/__stf/utility/cuda_safe_call.cuh
user: login: caugonnet
body: ::cuda::__throw_cuda_error(status, message)
created_at: 2025-04-08T14:17:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -312,7 +320,11 @@ struct expecter
     {
       return ::std::forward<L>(e.lhs);
     }
+#  ifndef _CCCL_NO_EXCEPTIONS
path: cudax/include/cuda/experimental/__stf/utility/unittest.cuh
user: login: caugonnet
body: the "failure" exception itself is in the proper namespace, but i'm going to also add this helper to adress the case of --no-exceptions properly
created_at: 2025-04-08T14:25:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -323,7 +323,11 @@ void cuda_try(Status status, const _CUDA_VSTD::source_location loc = _CUDA_VSTD:
 {
   if (status)
   {
+#ifndef _CCCL_NO_EXCEPTIONS
     throw cuda_exception(status, loc);
path: cudax/include/cuda/experimental/__stf/utility/cuda_safe_call.cuh
user: login: caugonnet
body: actually that would make it even more complex
created_at: 2025-04-08T15:10:53Z
author_association: CONTRIBUTOR
diff_hunk: @@ -365,8 +365,10 @@ auto all_convertible(P&&... p)
   unsigned char buffer[size * sizeof(T)];
   auto& result = *reinterpret_cast<::std::array<T, size>*>(&buffer[0]);
   size_t i     = 0; // marks the already-constructed portion of the array
+#ifndef _CCCL_NO_EXCEPTIONS
path: cudax/include/cuda/experimental/__stf/utility/traits.cuh
user: login: caugonnet
body: Since we still throw eventually i'm not sure it's applicable ?
created_at: 2025-04-08T15:12:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -534,6 +545,10 @@ UNITTEST("EXPECT")
   EXPECT(1 + 1 == 2, "All we know about mathematics has been upended!"); // pass
   auto p = EXPECT(malloc(100) != nullptr); // pass, put the pointer to allocated memory in p
   free(p);
+
+  // This test is specifically about how we handle exceptions, so we disable it
+  // when exceptions are not allowed
+#  ifndef _CCCL_NO_EXCEPTIONS
path: cudax/include/cuda/experimental/__stf/utility/unittest.cuh
user: login: miscco
body: I just merged a PR that changes this to
```suggestion
#  if _CCCL_HAS_EXCEPTIONS()
```

Applies throughout
created_at: 2025-04-09T06:56:01Z
author_association: CONTRIBUTOR
diff_hunk: @@ -534,6 +545,10 @@ UNITTEST("EXPECT")
   EXPECT(1 + 1 == 2, "All we know about mathematics has been upended!"); // pass
   auto p = EXPECT(malloc(100) != nullptr); // pass, put the pointer to allocated memory in p
   free(p);
+
+  // This test is specifically about how we handle exceptions, so we disable it
+  // when exceptions are not allowed
+#  ifndef _CCCL_NO_EXCEPTIONS
path: cudax/include/cuda/experimental/__stf/utility/unittest.cuh
user: login: caugonnet
body: done !
created_at: 2025-04-09T07:08:05Z
author_association: CONTRIBUTOR

PR comments:
user: login: copy-pr-bot[bot]
created_at: 2025-04-08T13:31:48Z
body: This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities [here](https://docs.gha-runners.nvidia.com/cpr/vetters).

Contributors can view more details about this message [here](https://docs.gha-runners.nvidia.com/cpr/contributors).

author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-04-08T13:32:49Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-08T14:06:21Z
body: <details><summary>🟩 CI finished in 31m 49s: Pass: 100%/24  | Total:  4h 47m | Avg: 11m 58s | Max: 31m 46s | Hits:  81%/13500</summary>

<ul>
<li>
<details><summary><h3>🟩 cudax: Pass: 100%/24  | Total:  4h 47m | Avg: 11m 58s | Max: 31m 46s | Hits:  81%/13500 </h3></summary>

```
🟩 cpu
  🟩 amd64              Pass: 100%/20  | Total:  4h 12m | Avg: 12m 36s | Max: 31m 46s | Hits:  81%/11148 
  🟩 arm64              Pass: 100%/4   | Total: 35m 15s | Avg:  8m 48s | Max:  9m 22s | Hits:  80%/2352  
🟩 ctk
  🟩 12.0               Pass: 100%/1   | Total: 11m 58s | Avg: 11m 58s | Max: 11m 58s | Hits:  95%/282   
  🟩 12.8               Pass: 100%/23  | Total:  4h 35m | Avg: 11m 58s | Max: 31m 46s | Hits:  80%/13218 
🟩 cudacxx
  🟩 nvcc12.0           Pass: 100%/1   | Total: 11m 58s | Avg: 11m 58s | Max: 11m 58s | Hits:  95%/282   
  🟩 nvcc12.8           Pass: 100%/23  | Total:  4h 35m | Avg: 11m 58s | Max: 31m 46s | Hits:  80%/13218 
🟩 cudacxx_family
  🟩 nvcc               Pass: 100%/24  | Total:  4h 47m | Avg: 11m 58s | Max: 31m 46s | Hits:  81%/13500 
🟩 cxx
  🟩 Clang14            Pass: 100%/1   | Total: 10m 05s | Avg: 10m 05s | Max: 10m 05s | Hits:  81%/590   
  🟩 Clang15            Pass: 100%/1   | Total: 10m 57s | Avg: 10m 57s | Max: 10m 57s | Hits:  80%/588   
  🟩 Clang16            Pass: 100%/1   | Total: 10m 45s | Avg: 10m 45s | Max: 10m 45s | Hits:  80%/588   
  🟩 Clang17            Pass: 100%/1   | Total: 10m 13s | Avg: 10m 13s | Max: 10m 13s | Hits:  80%/588   
  🟩 Clang18            Pass: 100%/1   | Total: 10m 16s | Avg: 10m 16s | Max: 10m 16s | Hits:  80%/588   
  🟩 Clang19            Pass: 100%/4   | Total: 40m 08s | Avg: 10m 02s | Max: 13m 05s | Hits:  85%/2352  
  🟩 GCC10              Pass: 100%/1   | Total:  9m 53s | Avg:  9m 53s | Max:  9m 53s | Hits:  80%/590   
  🟩 GCC11              Pass: 100%/1   | Total: 10m 33s | Avg: 10m 33s | Max: 10m 33s | Hits:  80%/588   
  🟩 GCC12              Pass: 100%/1   | Total: 11m 03s | Avg: 11m 03s | Max: 11m 03s | Hits:  80%/588   
  🟩 GCC13              Pass: 100%/8   | Total:  1h 17m | Avg:  9m 40s | Max: 13m 24s | Hits:  85%/4704  
  🟩 MSVC14.39          Pass: 100%/1   | Total: 11m 58s | Avg: 11m 58s | Max: 11m 58s | Hits:  95%/282   
  🟩 MSVC14.42          Pass: 100%/1   | Total: 11m 59s | Avg: 11m 59s | Max: 11m 59s | Hits:  95%/282   
  🟩 NVHPC25.3          Pass: 100%/2   | Total:  1h 02m | Avg: 31m 03s | Max: 31m 46s | Hits:  48%/1172  
🟩 cxx_family
  🟩 Clang              Pass: 100%/9   | Total:  1h 32m | Avg: 10m 16s | Max: 13m 05s | Hits:  83%/5294  
  🟩 GCC                Pass: 100%/11  | Total:  1h 48m | Avg:  9m 53s | Max: 13m 24s | Hits:  84%/6470  
  🟩 MSVC               Pass: 100%/2   | Total: 23m 57s | Avg: 11m 58s | Max: 11m 59s | Hits:  95%/564   
  🟩 NVHPC              Pass: 100%/2   | Total:  1h 02m | Avg: 31m 03s | Max: 31m 46s | Hits:  48%/1172  
🟩 gpu
  🟩 h100               Pass: 100%/2   | Total: 19m 33s | Avg:  9m 46s | Max: 11m 52s | Hits:  90%/1176  
  🟩 rtx2080            Pass: 100%/22  | Total:  4h 27m | Avg: 12m 10s | Max: 31m 46s | Hits:  80%/12324 
🟩 jobs
  🟩 Build              Pass: 100%/21  | Total:  4h 08m | Avg: 11m 51s | Max: 31m 46s | Hits:  78%/11736 
  🟩 Test               Pass: 100%/3   | Total: 38m 21s | Avg: 12m 47s | Max: 13m 24s | Hits:  99%/1764  
🟩 sm
  🟩 90                 Pass: 100%/3   | Total: 27m 04s | Avg:  9m 01s | Max: 11m 52s | Hits:  86%/1764  
  🟩 90a                Pass: 100%/1   | Total:  7m 53s | Avg:  7m 53s | Max:  7m 53s | Hits:  80%/588   
🟩 std
  🟩 17                 Pass: 100%/4   | Total: 56m 24s | Avg: 14m 06s | Max: 31m 46s | Hits:  72%/2350  
  🟩 20                 Pass: 100%/20  | Total:  3h 50m | Avg: 11m 32s | Max: 30m 20s | Hits:  82%/11150 
```

</details>

</ul>

<details><summary><h3>👃 Inspect Changes</h3></summary>

### Modifications in project?

|     | Project
|-----|---------
|     | CCCL Infrastructure
|     | libcu++
|     | CUB
|     | Thrust
| +/- | CUDA Experimental
|     | stdpar
|     | python
|     | CCCL C Parallel Library
|     | Catch2Helper

### Modifications in project or dependencies?

|     | Project
|-----|---------
|     | CCCL Infrastructure
|     | libcu++
|     | CUB
|     | Thrust
| +/- | CUDA Experimental
|     | stdpar
|     | python
|     | CCCL C Parallel Library
|     | Catch2Helper
</details>


<details><summary><h2>🏃‍ Runner counts (total jobs: 24)</h2></summary>

|  #   | Runner
|------|------
|   15 | `linux-amd64-cpu16`
|    4 | `linux-arm64-cpu16`
|    2 | `windows-amd64-cpu16`
|    2 | `linux-amd64-gpu-rtx2080-latest-1`
|    1 | `linux-amd64-gpu-h100-latest-1`


</details>

</details>

author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-04-08T15:12:45Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-04-08T15:20:09Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-08T15:36:25Z
body: <details><summary>🟨 CI finished in 14m 12s: Pass:   8%/24  | Total:  1h 17m | Avg:  3m 12s | Max: 12m 34s | Hits:  95%/564</summary>

<ul>
<li>
<details><summary><h3>🟨 cudax: Pass:   8%/24  | Total:  1h 17m | Avg:  3m 12s | Max: 12m 34s | Hits:  95%/564   </h3></summary>

```
🔍 ctk: 12.8 🔍
  🟩 12.0               Pass: 100%/1   | Total: 12m 34s | Avg: 12m 34s | Max: 12m 34s | Hits:  95%/282   
  🔍 12.8               Pass:   4%/23  | Total:  1h 04m | Avg:  2m 48s | Max: 12m 13s | Hits:  95%/282   
🔍 cudacxx: nvcc12.8 🔍
  🟩 nvcc12.0           Pass: 100%/1   | Total: 12m 34s | Avg: 12m 34s | Max: 12m 34s | Hits:  95%/282   
  🔍 nvcc12.8           Pass:   4%/23  | Total:  1h 04m | Avg:  2m 48s | Max: 12m 13s | Hits:  95%/282   
🟨 cxx
  🟥 Clang14            Pass:   0%/1   | Total:  2m 32s | Avg:  2m 32s | Max:  2m 32s
  🟥 Clang15            Pass:   0%/1   | Total:  2m 53s | Avg:  2m 53s | Max:  2m 53s
  🟥 Clang16            Pass:   0%/1   | Total:  2m 46s | Avg:  2m 46s | Max:  2m 46s
  🟥 Clang17            Pass:   0%/1   | Total:  2m 37s | Avg:  2m 37s | Max:  2m 37s
  🟥 Clang18            Pass:   0%/1   | Total:  2m 32s | Avg:  2m 32s | Max:  2m 32s
  🟥 Clang19            Pass:   0%/4   | Total:  6m 16s | Avg:  1m 34s | Max:  2m 29s
  🟥 GCC10              Pass:   0%/1   | Total:  2m 31s | Avg:  2m 31s | Max:  2m 31s
  🟥 GCC11              Pass:   0%/1   | Total:  2m 20s | Avg:  2m 20s | Max:  2m 20s
  🟥 GCC12              Pass:   0%/1   | Total:  2m 25s | Avg:  2m 25s | Max:  2m 25s
  🟥 GCC13              Pass:   0%/8   | Total: 14m 20s | Avg:  1m 47s | Max:  2m 49s
  🟩 MSVC14.39          Pass: 100%/1   | Total: 12m 34s | Avg: 12m 34s | Max: 12m 34s | Hits:  95%/282   
  🟩 MSVC14.42          Pass: 100%/1   | Total: 12m 13s | Avg: 12m 13s | Max: 12m 13s | Hits:  95%/282   
  🟥 NVHPC25.3          Pass:   0%/2   | Total: 11m 06s | Avg:  5m 33s | Max:  5m 44s
🟨 cxx_family
  🟥 Clang              Pass:   0%/9   | Total: 19m 36s | Avg:  2m 10s | Max:  2m 53s
  🟥 GCC                Pass:   0%/11  | Total: 21m 36s | Avg:  1m 57s | Max:  2m 49s
  🟩 MSVC               Pass: 100%/2   | Total: 24m 47s | Avg: 12m 23s | Max: 12m 34s | Hits:  95%/564   
  🟥 NVHPC              Pass:   0%/2   | Total: 11m 06s | Avg:  5m 33s | Max:  5m 44s
🟨 cudacxx_family
  🟨 nvcc               Pass:   8%/24  | Total:  1h 17m | Avg:  3m 12s | Max: 12m 34s | Hits:  95%/564   
🟨 cpu
  🟨 amd64              Pass:  10%/20  | Total:  1h 09m | Avg:  3m 28s | Max: 12m 34s | Hits:  95%/564   
  🟥 arm64              Pass:   0%/4   | Total:  7m 35s | Avg:  1m 53s | Max:  1m 56s
🟨 gpu
  🟥 h100               Pass:   0%/2   | Total:  2m 27s | Avg:  1m 13s | Max:  2m 27s
  🟨 rtx2080            Pass:   9%/22  | Total:  1h 14m | Avg:  3m 23s | Max: 12m 34s | Hits:  95%/564   
🟨 jobs
  🟨 Build              Pass:   9%/21  | Total:  1h 17m | Avg:  3m 40s | Max: 12m 34s | Hits:  95%/564   
  🟥 Test               Pass:   0%/3  
🟥 sm
  🟥 90                 Pass:   0%/3   | Total:  5m 13s | Avg:  1m 44s | Max:  2m 46s
  🟥 90a                Pass:   0%/1   | Total:  2m 30s | Avg:  2m 30s | Max:  2m 30s
🟨 std
  🟥 17                 Pass:   0%/4   | Total: 11m 58s | Avg:  2m 59s | Max:  5m 22s
  🟨 20                 Pass:  10%/20  | Total:  1h 05m | Avg:  3m 15s | Max: 12m 34s | Hits:  95%/564   
```

</details>

</ul>

<details><summary><h3>👃 Inspect Changes</h3></summary>

### Modifications in project?

|     | Project
|-----|---------
|     | CCCL Infrastructure
|     | libcu++
|     | CUB
|     | Thrust
| +/- | CUDA Experimental
|     | stdpar
|     | python
|     | CCCL C Parallel Library
|     | Catch2Helper

### Modifications in project or dependencies?

|     | Project
|-----|---------
|     | CCCL Infrastructure
|     | libcu++
|     | CUB
|     | Thrust
| +/- | CUDA Experimental
|     | stdpar
|     | python
|     | CCCL C Parallel Library
|     | Catch2Helper
</details>


<details><summary><h2>🏃‍ Runner counts (total jobs: 24)</h2></summary>

|  #   | Runner
|------|------
|   15 | `linux-amd64-cpu16`
|    4 | `linux-arm64-cpu16`
|    2 | `windows-amd64-cpu16`
|    2 | `linux-amd64-gpu-rtx2080-latest-1`
|    1 | `linux-amd64-gpu-h100-latest-1`


</details>

</details>

author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-04-09T05:38:37Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-09T06:15:06Z
body: <details><summary>🟩 CI finished in 34m 02s: Pass: 100%/24  | Total:  6h 20m | Avg: 15m 50s | Max: 32m 44s | Hits:  57%/13500</summary>

<ul>
<li>
<details><summary><h3>🟩 cudax: Pass: 100%/24  | Total:  6h 20m | Avg: 15m 50s | Max: 32m 44s | Hits:  57%/13500 </h3></summary>

```
🟩 cpu
  🟩 amd64              Pass: 100%/20  | Total:  5h 25m | Avg: 16m 16s | Max: 32m 44s | Hits:  59%/11148 
  🟩 arm64              Pass: 100%/4   | Total: 54m 41s | Avg: 13m 40s | Max: 14m 55s | Hits:  51%/2352  
🟩 ctk
  🟩 12.0               Pass: 100%/1   | Total: 12m 12s | Avg: 12m 12s | Max: 12m 12s | Hits:  95%/282   
  🟩 12.8               Pass: 100%/23  | Total:  6h 07m | Avg: 15m 59s | Max: 32m 44s | Hits:  57%/13218 
🟩 cudacxx
  🟩 nvcc12.0           Pass: 100%/1   | Total: 12m 12s | Avg: 12m 12s | Max: 12m 12s | Hits:  95%/282   
  🟩 nvcc12.8           Pass: 100%/23  | Total:  6h 07m | Avg: 15m 59s | Max: 32m 44s | Hits:  57%/13218 
🟩 cudacxx_family
  🟩 nvcc               Pass: 100%/24  | Total:  6h 20m | Avg: 15m 50s | Max: 32m 44s | Hits:  57%/13500 
🟩 cxx
  🟩 Clang14            Pass: 100%/1   | Total: 15m 33s | Avg: 15m 33s | Max: 15m 33s | Hits:  51%/590   
  🟩 Clang15            Pass: 100%/1   | Total: 15m 45s | Avg: 15m 45s | Max: 15m 45s | Hits:  51%/588   
  🟩 Clang16            Pass: 100%/1   | Total: 15m 21s | Avg: 15m 21s | Max: 15m 21s | Hits:  51%/588   
  🟩 Clang17            Pass: 100%/1   | Total: 15m 35s | Avg: 15m 35s | Max: 15m 35s | Hits:  51%/588   
  🟩 Clang18            Pass: 100%/1   | Total: 16m 10s | Avg: 16m 10s | Max: 16m 10s | Hits:  51%/588   
  🟩 Clang19            Pass: 100%/4   | Total: 54m 08s | Avg: 13m 32s | Max: 15m 39s | Hits:  63%/2352  
  🟩 GCC10              Pass: 100%/1   | Total: 16m 49s | Avg: 16m 49s | Max: 16m 49s | Hits:  51%/590   
  🟩 GCC11              Pass: 100%/1   | Total: 15m 40s | Avg: 15m 40s | Max: 15m 40s | Hits:  50%/588   
  🟩 GCC12              Pass: 100%/1   | Total: 18m 20s | Avg: 18m 20s | Max: 18m 20s | Hits:  50%/588   
  🟩 GCC13              Pass: 100%/8   | Total:  1h 47m | Avg: 13m 27s | Max: 15m 48s | Hits:  60%/4704  
  🟩 MSVC14.39          Pass: 100%/1   | Total: 12m 12s | Avg: 12m 12s | Max: 12m 12s | Hits:  95%/282   
  🟩 MSVC14.42          Pass: 100%/1   | Total: 12m 24s | Avg: 12m 24s | Max: 12m 24s | Hits:  95%/282   
  🟩 NVHPC25.3          Pass: 100%/2   | Total:  1h 04m | Avg: 32m 16s | Max: 32m 44s | Hits:  48%/1172  
🟩 cxx_family
  🟩 Clang              Pass: 100%/9   | Total:  2h 12m | Avg: 14m 43s | Max: 16m 10s | Hits:  56%/5294  
  🟩 GCC                Pass: 100%/11  | Total:  2h 38m | Avg: 14m 24s | Max: 18m 20s | Hits:  57%/6470  
  🟩 MSVC               Pass: 100%/2   | Total: 24m 36s | Avg: 12m 18s | Max: 12m 24s | Hits:  95%/564   
  🟩 NVHPC              Pass: 100%/2   | Total:  1h 04m | Avg: 32m 16s | Max: 32m 44s | Hits:  48%/1172  
🟩 gpu
  🟩 h100               Pass: 100%/2   | Total: 24m 37s | Avg: 12m 18s | Max: 13m 01s | Hits:  69%/1176  
  🟩 rtx2080            Pass: 100%/22  | Total:  5h 55m | Avg: 16m 09s | Max: 32m 44s | Hits:  56%/12324 
🟩 jobs
  🟩 Build              Pass: 100%/21  | Total:  5h 40m | Avg: 16m 13s | Max: 32m 44s | Hits:  51%/11736 
  🟩 Test               Pass: 100%/3   | Total: 39m 22s | Avg: 13m 07s | Max: 15m 48s | Hits:  99%/1764  
🟩 sm
  🟩 90                 Pass: 100%/3   | Total: 36m 05s | Avg: 12m 01s | Max: 13m 01s | Hits:  59%/1764  
  🟩 90a                Pass: 100%/1   | Total: 11m 48s | Avg: 11m 48s | Max: 11m 48s | Hits:  50%/588   
🟩 std
  🟩 17                 Pass: 100%/4   | Total:  1h 09m | Avg: 17m 20s | Max: 31m 48s | Hits:  47%/2350  
  🟩 20                 Pass: 100%/20  | Total:  5h 10m | Avg: 15m 32s | Max: 32m 44s | Hits:  60%/11150 
```

</details>

</ul>

<details><summary><h3>👃 Inspect Changes</h3></summary>

### Modifications in project?

|     | Project
|-----|---------
|     | CCCL Infrastructure
|     | libcu++
|     | CUB
|     | Thrust
| +/- | CUDA Experimental
|     | stdpar
|     | python
|     | CCCL C Parallel Library
|     | Catch2Helper

### Modifications in project or dependencies?

|     | Project
|-----|---------
|     | CCCL Infrastructure
|     | libcu++
|     | CUB
|     | Thrust
| +/- | CUDA Experimental
|     | stdpar
|     | python
|     | CCCL C Parallel Library
|     | Catch2Helper
</details>


<details><summary><h2>🏃‍ Runner counts (total jobs: 24)</h2></summary>

|  #   | Runner
|------|------
|   15 | `linux-amd64-cpu16`
|    4 | `linux-arm64-cpu16`
|    2 | `windows-amd64-cpu16`
|    2 | `linux-amd64-gpu-rtx2080-latest-1`
|    1 | `linux-amd64-gpu-h100-latest-1`


</details>

</details>

author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-04-09T06:54:33Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-04-09T07:08:20Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-09T07:56:49Z
body: <details><summary>🟩 CI finished in 46m 24s: Pass: 100%/24  | Total:  2h 50m | Avg:  7m 07s | Max: 22m 48s | Hits:  96%/13500</summary>

<ul>
<li>
<details><summary><h3>🟩 cudax: Pass: 100%/24  | Total:  2h 50m | Avg:  7m 07s | Max: 22m 48s | Hits:  96%/13500 </h3></summary>

```
🟩 cpu
  🟩 amd64              Pass: 100%/20  | Total:  2h 38m | Avg:  7m 56s | Max: 22m 48s | Hits:  95%/11148 
  🟩 arm64              Pass: 100%/4   | Total: 11m 53s | Avg:  2m 58s | Max:  3m 01s | Hits:  99%/2352  
🟩 ctk
  🟩 12.0               Pass: 100%/1   | Total: 12m 33s | Avg: 12m 33s | Max: 12m 33s | Hits:  95%/282   
  🟩 12.8               Pass: 100%/23  | Total:  2h 38m | Avg:  6m 52s | Max: 22m 48s | Hits:  96%/13218 
🟩 cudacxx
  🟩 nvcc12.0           Pass: 100%/1   | Total: 12m 33s | Avg: 12m 33s | Max: 12m 33s | Hits:  95%/282   
  🟩 nvcc12.8           Pass: 100%/23  | Total:  2h 38m | Avg:  6m 52s | Max: 22m 48s | Hits:  96%/13218 
🟩 cudacxx_family
  🟩 nvcc               Pass: 100%/24  | Total:  2h 50m | Avg:  7m 07s | Max: 22m 48s | Hits:  96%/13500 
🟩 cxx
  🟩 Clang14            Pass: 100%/1   | Total:  3m 21s | Avg:  3m 21s | Max:  3m 21s | Hits: 100%/590   
  🟩 Clang15            Pass: 100%/1   | Total:  3m 26s | Avg:  3m 26s | Max:  3m 26s | Hits: 100%/588   
  🟩 Clang16            Pass: 100%/1   | Total:  3m 31s | Avg:  3m 31s | Max:  3m 31s | Hits: 100%/588   
  🟩 Clang17            Pass: 100%/1   | Total:  3m 30s | Avg:  3m 30s | Max:  3m 30s | Hits: 100%/588   
  🟩 Clang18            Pass: 100%/1   | Total:  3m 39s | Avg:  3m 39s | Max:  3m 39s | Hits: 100%/588   
  🟩 Clang19            Pass: 100%/4   | Total: 21m 29s | Avg:  5m 22s | Max: 11m 57s | Hits: 100%/2352  
  🟩 GCC10              Pass: 100%/1   | Total:  3m 32s | Avg:  3m 32s | Max:  3m 32s | Hits:  99%/590   
  🟩 GCC11              Pass: 100%/1   | Total:  3m 19s | Avg:  3m 19s | Max:  3m 19s | Hits:  99%/588   
  🟩 GCC12              Pass: 100%/1   | Total:  3m 30s | Avg:  3m 30s | Max:  3m 30s | Hits:  99%/588   
  🟩 GCC13              Pass: 100%/8   | Total: 51m 42s | Avg:  6m 27s | Max: 18m 03s | Hits:  99%/4704  
  🟩 MSVC14.39          Pass: 100%/1   | Total: 12m 33s | Avg: 12m 33s | Max: 12m 33s | Hits:  95%/282   
  🟩 MSVC14.42          Pass: 100%/1   | Total: 12m 04s | Avg: 12m 04s | Max: 12m 04s | Hits:  95%/282   
  🟩 NVHPC25.3          Pass: 100%/2   | Total: 45m 13s | Avg: 22m 36s | Max: 22m 48s | Hits:  60%/1172  
🟩 cxx_family
  🟩 Clang              Pass: 100%/9   | Total: 38m 56s | Avg:  4m 19s | Max: 11m 57s | Hits: 100%/5294  
  🟩 GCC                Pass: 100%/11  | Total:  1h 02m | Avg:  5m 38s | Max: 18m 03s | Hits:  99%/6470  
  🟩 MSVC               Pass: 100%/2   | Total: 24m 37s | Avg: 12m 18s | Max: 12m 33s | Hits:  95%/564   
  🟩 NVHPC              Pass: 100%/2   | Total: 45m 13s | Avg: 22m 36s | Max: 22m 48s | Hits:  60%/1172  
🟩 gpu
  🟩 h100               Pass: 100%/2   | Total: 17m 34s | Avg:  8m 47s | Max: 14m 34s | Hits:  99%/1176  
  🟩 rtx2080            Pass: 100%/22  | Total:  2h 33m | Avg:  6m 57s | Max: 22m 48s | Hits:  95%/12324 
🟩 jobs
  🟩 Build              Pass: 100%/21  | Total:  2h 06m | Avg:  6m 00s | Max: 22m 48s | Hits:  95%/11736 
  🟩 Test               Pass: 100%/3   | Total: 44m 34s | Avg: 14m 51s | Max: 18m 03s | Hits:  99%/1764  
🟩 sm
  🟩 90                 Pass: 100%/3   | Total: 20m 47s | Avg:  6m 55s | Max: 14m 34s | Hits:  99%/1764  
  🟩 90a                Pass: 100%/1   | Total:  3m 12s | Avg:  3m 12s | Max:  3m 12s | Hits:  99%/588   
🟩 std
  🟩 17                 Pass: 100%/4   | Total: 31m 31s | Avg:  7m 52s | Max: 22m 25s | Hits:  89%/2350  
  🟩 20                 Pass: 100%/20  | Total:  2h 19m | Avg:  6m 57s | Max: 22m 48s | Hits:  97%/11150 
```

</details>

</ul>

<details><summary><h3>👃 Inspect Changes</h3></summary>

### Modifications in project?

|     | Project
|-----|---------
|     | CCCL Infrastructure
|     | libcu++
|     | CUB
|     | Thrust
| +/- | CUDA Experimental
|     | stdpar
|     | python
|     | CCCL C Parallel Library
|     | Catch2Helper

### Modifications in project or dependencies?

|     | Project
|-----|---------
|     | CCCL Infrastructure
|     | libcu++
|     | CUB
|     | Thrust
| +/- | CUDA Experimental
|     | stdpar
|     | python
|     | CCCL C Parallel Library
|     | Catch2Helper
</details>


<details><summary><h2>🏃‍ Runner counts (total jobs: 24)</h2></summary>

|  #   | Runner
|------|------
|   15 | `linux-amd64-cpu16`
|    4 | `linux-arm64-cpu16`
|    2 | `windows-amd64-cpu16`
|    2 | `linux-amd64-gpu-rtx2080-latest-1`
|    1 | `linux-amd64-gpu-h100-latest-1`


</details>

</details>

author_association: CONTRIBUTOR