Repository: NVIDIA/cccl
Pull request #3857: [STF] Enable NVHPC in CUDASTF CI
Author: login: caugonnet
Labels: name: stf
description: Sequential Task Flow programming model
Created: 2025-02-19T07:47:19Z | Merged: 2025-03-26T08:12:52Z

## Description

NVHPC support was disabled in CUDASTF, this PR restores it since it should be supported now

<!-- Every PR should have a corresponding issue that describes and motivates the work done in the PR -->
closes <!-- Link issue here -->

<!-- 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/examples/CMakeLists.txt b/cudax/examples/CMakeLists.txt
index 9003a27b3fb..13164f51035 100644
--- a/cudax/examples/CMakeLists.txt
+++ b/cudax/examples/CMakeLists.txt
@@ -72,8 +72,7 @@ endforeach()
 
 # FIXME: Enable MSVC
 if (cudax_ENABLE_CUDASTF AND
-    NOT "MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}" AND
-    NOT "NVHPC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
+    NOT "MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
   # STF examples are handled separately:
   add_subdirectory(stf)
 endif()
diff --git a/cudax/include/cuda/experimental/__stf/internal/backend_ctx.cuh b/cudax/include/cuda/experimental/__stf/internal/backend_ctx.cuh
index 4adb2698f20..32df970953f 100644
--- a/cudax/include/cuda/experimental/__stf/internal/backend_ctx.cuh
+++ b/cudax/include/cuda/experimental/__stf/internal/backend_ctx.cuh
@@ -69,7 +69,7 @@ class stream_ctx;
 namespace reserved
 {
 
-template <typename Ctx, typename shape_t, typename partitioner_t, typename... DepsAndOps>
+template <typename Ctx, typename exec_place_t, typename shape_t, typename partitioner_t, typename... DepsAndOps>
 class parallel_for_scope;
 
 template <typename Ctx, typename thread_hierarchy_spec_t, typename... Deps>
@@ -1030,27 +1030,31 @@ public:
   /*
    * parallel_for : apply an operation over a shaped index space
    */
-  template <typename S, typename... Deps>
-  auto parallel_for(exec_place e_place, S shape, Deps... deps)
+
+  template <typename exec_place_t,
+            typename S,
+            typename... Deps,
+            typename = ::std::enable_if_t<::std::is_base_of_v<exec_place, exec_place_t>>>
+  auto parallel_for(exec_place_t e_place, S shape, Deps... deps)
   {
-    return reserved::parallel_for_scope<Engine, S, null_partition, Deps...>(self(), mv(e_place), mv(shape), mv(deps)...);
+    return reserved::parallel_for_scope<Engine, exec_place_t, S, null_partition, Deps...>(
+      self(), mv(e_place), mv(shape), mv(deps)...);
   }
 
-  template <typename partitioner_t, typename S, typename... Deps>
-  auto parallel_for(partitioner_t, exec_place e_place, S shape, Deps... deps)
+  template <typename partitioner_t,
+            typename exec_place_t,
+            typename S,
+            typename... Deps,
+            typename = ::std::enable_if_t<std::is_base_of_v<exec_place, exec_place_t>>>
+  auto parallel_for(partitioner_t, exec_place_t e_place, S shape, Deps... deps)
   {
-    return reserved::parallel_for_scope<Engine, S, partitioner_t, Deps...>(self(), mv(e_place), mv(shape), mv(deps)...);
+    return reserved::parallel_for_scope<Engine, exec_place_t, S, partitioner_t, Deps...>(
+      self(), mv(e_place), mv(shape), mv(deps)...);
   }
 
   template <typename S, typename... Deps>
   auto parallel_for(exec_place_grid e_place, S shape, Deps... deps) = delete;
 
-  template <typename partitioner_t, typename S, typename... Deps>
-  auto parallel_for(partitioner_t p, exec_place_grid e_place, S shape, Deps... deps)
-  {
-    return parallel_for(mv(p), exec_place(mv(e_place)), mv(shape), mv(deps)...);
-  }
-
   template <typename S, typename... Deps, typename... Ops, bool... flags>
   auto parallel_for(S shape, task_dep<Deps, Ops, flags>... deps)
   {
diff --git a/cudax/include/cuda/experimental/__stf/internal/parallel_for_scope.cuh b/cudax/include/cuda/experimental/__stf/internal/parallel_for_scope.cuh
index 42c46ea3373..004d55d03a0 100644
--- a/cudax/include/cuda/experimental/__stf/internal/parallel_for_scope.cuh
+++ b/cudax/include/cuda/experimental/__stf/internal/parallel_for_scope.cuh
@@ -403,7 +403,7 @@ loop_redux_finalize(tuple_args targs, redux_vars<tuple_args, tuple_ops>* redux_b
  *
  * @tparam deps_t
  */
-template <typename context, typename shape_t, typename partitioner_t, typename... deps_ops_t>
+template <typename context, typename exec_place_t, typename shape_t, typename partitioner_t, typename... deps_ops_t>
 class parallel_for_scope
 {
   //  using deps_t = typename reserved::extract_all_first_types<deps_ops_t...>::type;
@@ -421,7 +421,7 @@ public:
   /// @param e_place Execution place for this parallel_for
   /// @param shape Shape to iterate
   /// @param ...deps Dependencies
-  parallel_for_scope(context& ctx, exec_place e_place, shape_t shape, deps_ops_t... deps)
+  parallel_for_scope(context& ctx, exec_place_t e_place, shape_t shape, deps_ops_t... deps)
       : dump_hooks(reserved::get_dump_hooks(&ctx, deps...))
       , deps(mv(deps)...)
       , ctx(ctx)
@@ -586,7 +586,7 @@ public:
     else if constexpr (is_extended_host_device_lambda_closure_type)
     {
       // Can run on both - decide dynamically
-      if (e_place == exec_place::host())
+      if (e_place.is_host())
       {
         return do_parallel_for_host(::std::forward<Fun>(f), shape, t);
       }
@@ -595,18 +595,19 @@ public:
     else if constexpr (is_extended_device_lambda_closure_type)
     {
       // Lambda can run only on device - make sure they're not trying it on the host
-      EXPECT(e_place != exec_place::host(), "Attempt to run a device function on the host.");
+      EXPECT(!e_place.is_host(), "Attempt to run a device function on the host.");
       // Fall through for the device implementation
     }
     else
     {
       // Lambda can run only on the host - make sure they're not trying it elsewhere
-      EXPECT(e_place == exec_place::host(), "Attempt to run a host function on a device.");
+      EXPECT(e_place.is_host(), "Attempt to run a host function on a device.");
       return do_parallel_for_host(::std::forward<Fun>(f), shape, t);
     }
 
     // Device land. Must use the supplemental if constexpr below to avoid compilation errors.
-    if constexpr (is_extended_host_device_lambda_closure_type || is_extended_device_lambda_closure_type)
+    if constexpr (!::std::is_same_v<exec_place_t, exec_place_host> && is_extended_host_device_lambda_closure_type
+                  || is_extended_device_lambda_closure_type)
     {
       if (!e_place.is_grid())
       {
@@ -987,7 +988,7 @@ private:
   ::std::vector<::std::function<void()>> dump_hooks;
   ::std::tuple<deps_ops_t...> deps;
   context& ctx;
-  exec_place e_place;
+  exec_place_t e_place;
   ::std::string symbol;
   shape_t shape;
 };
diff --git a/cudax/include/cuda/experimental/__stf/places/places.cuh b/cudax/include/cuda/experimental/__stf/places/places.cuh
index 6fdccadc1b8..27c2fff8286 100644
--- a/cudax/include/cuda/experimental/__stf/places/places.cuh
+++ b/cudax/include/cuda/experimental/__stf/places/places.cuh
@@ -376,6 +376,11 @@ public:
       return "exec(" + affine.to_string() + ")";
     }
 
+    virtual bool is_host() const
+    {
+      return affine.is_host();
+    }
+
     virtual bool is_device() const
     {
       return affine.is_device();
@@ -553,6 +558,11 @@ public:
     pimpl->deactivate(state, p);
   }
 
+  bool is_host() const
+  {
+    return pimpl->is_host();
+  }
+
   bool is_device() const
   {
     return pimpl->is_device();
diff --git a/cudax/include/cuda/experimental/stf.cuh b/cudax/include/cuda/experimental/stf.cuh
index 7fe86295734..371838f2914 100644
--- a/cudax/include/cuda/experimental/stf.cuh
+++ b/cudax/include/cuda/experimental/stf.cuh
@@ -403,12 +403,15 @@ public:
   /*
    * parallel_for : apply an operation over a shaped index space
    */
-  template <typename S, typename... Deps>
-  auto parallel_for(exec_place e_place, S shape, Deps... deps)
+  template <typename exec_place_t,
+            typename S,
+            typename... Deps,
+            typename = ::std::enable_if_t<std::is_base_of_v<exec_place, exec_place_t>>>
+  auto parallel_for(exec_place_t e_place, S shape, Deps... deps)
   {
     EXPECT(payload.index() != ::std::variant_npos, "Context is not initialized.");
-    using result_t = unified_scope<reserved::parallel_for_scope<stream_ctx, S, null_partition, Deps...>,
-                                   reserved::parallel_for_scope<graph_ctx, S, null_partition, Deps...>>;
+    using result_t = unified_scope<reserved::parallel_for_scope<stream_ctx, exec_place_t, S, null_partition, Deps...>,
+                                   reserved::parallel_for_scope<graph_ctx, exec_place_t, S, null_partition, Deps...>>;
     return ::std::visit(
       [&](auto& self) {
         return result_t(self.parallel_for(mv(e_place), mv(shape), deps...));
@@ -416,12 +419,16 @@ public:
       payload);
   }
 
-  template <typename partitioner_t, typename S, typename... Deps>
-  auto parallel_for(partitioner_t p, exec_place e_place, S shape, Deps... deps)
+  template <typename partitioner_t,
+            typename exec_place_t,
+            typename S,
+            typename... Deps,
+            typename = ::std::enable_if_t<std::is_base_of_v<exec_place, exec_place_t>>>
+  auto parallel_for(partitioner_t p, exec_place_t e_place, S shape, Deps... deps)
   {
     EXPECT(payload.index() != ::std::variant_npos, "Context is not initialized.");
-    using result_t = unified_scope<reserved::parallel_for_scope<stream_ctx, S, partitioner_t, Deps...>,
-                                   reserved::parallel_for_scope<graph_ctx, S, partitioner_t, Deps...>>;
+    using result_t = unified_scope<reserved::parallel_for_scope<stream_ctx, exec_place_t, S, partitioner_t, Deps...>,
+                                   reserved::parallel_for_scope<graph_ctx, exec_place_t, S, partitioner_t, Deps...>>;
     return ::std::visit(
       [&](auto& self) {
         return result_t(self.parallel_for(mv(p), mv(e_place), mv(shape), deps...));
diff --git a/cudax/test/CMakeLists.txt b/cudax/test/CMakeLists.txt
index 2afd0b29c32..4a1c41524b1 100644
--- a/cudax/test/CMakeLists.txt
+++ b/cudax/test/CMakeLists.txt
@@ -144,8 +144,7 @@ endforeach()
 
 # FIXME: Enable MSVC
 if (cudax_ENABLE_CUDASTF AND
-    NOT "MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}" AND
-    NOT "NVHPC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
+    NOT "MSVC" STREQUAL "${CMAKE_CXX_COMPILER_ID}")
   # STF tests are handled separately:
   add_subdirectory(stf)
 endif()
diff --git a/cudax/test/stf/CMakeLists.txt b/cudax/test/stf/CMakeLists.txt
index f07954ea0c6..e7d9af98266 100644
--- a/cudax/test/stf/CMakeLists.txt
+++ b/cudax/test/stf/CMakeLists.txt
@@ -127,7 +127,6 @@ set(stf_test_codegen_sources
   parallel_for/parallel_for_box.cu
   parallel_for/parallel_for_repeat.cu
   parallel_for/test2_parallel_for_context.cu
-  parallel_for/test_parallel_for.cu
   parallel_for/tiled_loops.cu
   parallel_for/parallel_for_host.cu
   places/cuda_stream_place.cu
diff --git a/cudax/test/stf/parallel_for/parallel_for_host.cu b/cudax/test/stf/parallel_for/parallel_for_host.cu
index 6f52c2b3571..3ff84605e88 100644
--- a/cudax/test/stf/parallel_for/parallel_for_host.cu
+++ b/cudax/test/stf/parallel_for/parallel_for_host.cu
@@ -19,7 +19,7 @@ int main()
   int nqpoints = 3;
   auto ltoken  = ctx.logical_token();
 
-  ctx.parallel_for(exec_place::host(), box(5), ltoken.read())->*[nqpoints] __host__ __device__(size_t, void_interface) {
+  ctx.parallel_for(exec_place::host(), box(5), ltoken.read())->*[nqpoints] __host__(size_t, void_interface) {
     _CCCL_ASSERT(nqpoints == 3, "invalid value");
   };
 
diff --git a/cudax/test/stf/parallel_for/test_parallel_for.cu b/cudax/test/stf/parallel_for/test_parallel_for.cu
deleted file mode 100644
index 0b299b0ce2d..00000000000
--- a/cudax/test/stf/parallel_for/test_parallel_for.cu
+++ /dev/null
@@ -1,134 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of CUDASTF in CUDA C++ Core Libraries,
-// under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-// SPDX-FileCopyrightText: Copyright (c) 2022-2024 NVIDIA CORPORATION & AFFILIATES.
-//
-//===----------------------------------------------------------------------===//
-
-/**
- * @file
- * @brief This test ensures that the parallel_for API works properly with its
- *        different overloads (with places, partitioners, etc...)
- */
-
-#include <cuda/experimental/__stf/stream/stream_ctx.cuh>
-
-using namespace cuda::experimental::stf;
-
-__host__ __device__ double x0(size_t ind)
-{
-  return sin((double) ind);
-}
-
-__host__ __device__ double y0(size_t ind)
-{
-  return cos((double) ind);
-}
-
-int main()
-{
-  for (int style = 0; style < 7; ++style)
-  {
-    stream_ctx ctx;
-
-    const int N = 16;
-    double X[2 * N], Y[N];
-
-    for (size_t ind = 0; ind < 2 * N; ind++)
-    {
-      X[ind] = x0(ind);
-    }
-
-    for (size_t ind = 0; ind < N; ind++)
-    {
-      Y[ind] = y0(ind);
-    }
-
-    auto lx = ctx.logical_data(X);
-    auto ly = ctx.logical_data(Y);
-
-    switch (style)
-    {
-      case 0:
-        // Basic usage
-        ctx.parallel_for(ly.shape(), lx.read(), ly.rw())->*[=] _CCCL_DEVICE(size_t pos, auto sx, auto sy) {
-          sy(pos) += 0.5 * (sx(2 * pos) + sx(2 * pos + 1));
-        };
-        break;
-      case 1:
-        // This throws because you're attempting to run a device lambda on the host
-        try
-        {
-          ctx.parallel_for(exec_place::host(), ly.shape(), lx.read(), ly.rw())
-              ->*[=] _CCCL_DEVICE(size_t pos, auto sx, auto sy) {
-                    sy(pos) += 0.5 * (sx(2 * pos) + sx(2 * pos + 1));
-                  };
-        }
-        catch (std::exception&)
-        {
-          // All good, but don't check the result
-          ctx.finalize();
-          continue;
-        }
-        assert(0);
-        break;
-      case 2:
-        // This throws because you're attempting to run a host lambda on a device
-        try
-        {
-          ctx.parallel_for(ly.shape(), lx.read(), ly.rw())->*[=] __host__(size_t pos, auto sx, auto sy) {
-            sy(pos) += 0.5 * (sx(2 * pos) + sx(2 * pos + 1));
-          };
-        }
-        catch (std::exception&)
-        {
-          // All good, but don't check the result
-          ctx.finalize();
-          continue;
-        }
-        assert(0);
-        break;
-      case 3:
-        // This works because it dynamically selects the dual function to run on the host
-        ctx.parallel_for(exec_place::host(), ly.shape(), lx.read(), ly.rw())
-            ->*[=] __host__ __device__(size_t pos, slice<const double> sx, slice<double> sy) {
-                  sy(pos) += 0.5 * (sx(2 * pos) + sx(2 * pos + 1));
-                };
-        break;
-      case 4:
-        // This works because it dynamically selects the dual function to run on the device
-        ctx.parallel_for(exec_place::current_device(), ly.shape(), lx.read(), ly.rw())
-            ->*[=] __host__ __device__(size_t pos, slice<const double> sx, slice<double> sy) {
-                  sy(pos) += 0.5 * (sx(2 * pos) + sx(2 * pos + 1));
-                };
-        break;
-      case 5:
-        // This works because it dynamically selects the dual function to run on the current device
-        ctx.parallel_for(ly.shape(), lx.read(), ly.rw())
-            ->*[=] __host__ __device__(size_t pos, slice<const double> sx, slice<double> sy) {
-                  sy(pos) += 0.5 * (sx(2 * pos) + sx(2 * pos + 1));
-                };
-        break;
-      case 6:
-        // This works because it dispatches on all devices
-        ctx.parallel_for(blocked_partition(), exec_place::all_devices(), ly.shape(), lx.read(), ly.rw())
-            ->*[=] __host__ __device__(size_t pos, slice<const double> sx, slice<double> sy) {
-                  sy(pos) += 0.5 * (sx(2 * pos) + sx(2 * pos + 1));
-                };
-        break;
-      default:
-        assert(0);
-    }
-
-    /* Check the result on the host */
-    ctx.parallel_for(exec_place::host(), ly.shape(), lx.read(), ly.read())->*[=](size_t pos, auto sx, auto sy) {
-      EXPECT(fabs(sx(2 * pos) - x0(2 * pos)) < 0.0001);
-      EXPECT(fabs(sx(2 * pos + 1) - x0(2 * pos + 1)) < 0.0001);
-      EXPECT(fabs(sy(pos) - (y0(pos) + 0.5 * (x0(2 * pos) + x0(2 * pos + 1)))) < 0.0001);
-    };
-    ctx.finalize();
-  }
-}


Reviews:
user: login: andralex
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T20:46:46Z
user: login: andralex
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T20:47:13Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T21:33:49Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T21:35:17Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T21:39:09Z
user: login: miscco
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T06:59:41Z
user: login: caugonnet
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-25T08:14:11Z

Review comments:
diff_hunk: @@ -171,7 +171,7 @@ public:
   void fill(Fun&& fun)
   {
     nvtx_range r("fill");
-
+    
path: cudax/examples/stf/linear_algebra/07-potri.cu
user: login: andralex
body: You may want to set your editor to remove trailing spaces.
created_at: 2025-03-24T20:46:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -54,6 +54,15 @@
 namespace cuda::experimental::stf
 {
 
+template <typename T>
+struct is_shape_of : std::false_type {};
+
+template <typename U>
+struct is_shape_of<shape_of<U>> : std::true_type {};
+
+template <typename T>
+constexpr bool is_shape_of_v = is_shape_of<T>::value;
path: cudax/include/cuda/experimental/__stf/internal/backend_ctx.cuh
user: login: andralex
body: ```suggestion
template <typename T>
constexpr bool is_shape_of_v = false;

template <typename U>
constexpr bool is_shape_of_v<shape_of<U>> = true;
```
created_at: 2025-03-24T20:47:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -171,7 +171,7 @@ public:
   void fill(Fun&& fun)
   {
     nvtx_range r("fill");
-
+    
path: cudax/examples/stf/linear_algebra/07-potri.cu
user: login: caugonnet
body: yes these were due to the web-based conflict resolution
created_at: 2025-03-24T21:33:49Z
author_association: CONTRIBUTOR
diff_hunk: @@ -54,6 +54,15 @@
 namespace cuda::experimental::stf
 {
 
+template <typename T>
+struct is_shape_of : std::false_type {};
+
+template <typename U>
+struct is_shape_of<shape_of<U>> : std::true_type {};
+
+template <typename T>
+constexpr bool is_shape_of_v = is_shape_of<T>::value;
path: cudax/include/cuda/experimental/__stf/internal/backend_ctx.cuh
user: login: caugonnet
body: This does not work anyway :( a box class if for example a shape of a slice, but the box is not derived from a shape_of ... so we perhaps need to do things differently, or simply not try to match shape types unless we want them to be derived from a specific tag type ?
created_at: 2025-03-24T21:35:17Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1091,6 +1091,7 @@ void PDTRTRI(matrix<double>& A, cublasFillMode_t uplo, cublasDiagType_t diag)
 void PDLAUUM(matrix<double>& A, cublasFillMode_t uplo)
 {
   nvtx_range r("PDLAUUM");
+
path: cudax/examples/stf/linear_algebra/07-potri.cu
user: login: caugonnet
body: remove
created_at: 2025-03-24T21:39:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -54,6 +54,17 @@
 namespace cuda::experimental::stf
 {
 
+template <typename T>
path: cudax/include/cuda/experimental/__stf/internal/backend_ctx.cuh
user: login: caugonnet
body: remove, this does not work in practice or we would need to change how to define a new shape type
created_at: 2025-03-25T08:14:11Z
author_association: CONTRIBUTOR

PR comments:
user: login: copy-pr-bot[bot]
created_at: 2025-02-19T07:47:23Z
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-02-19T07:48:05Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-02-19T08:10:20Z
body: <details><summary>🟨 CI finished in 21m 04s: Pass:  90%/22  | Total:  2h 08m | Avg:  5m 49s | Max: 17m 38s | Hits:  97%/10554</summary>

<ul>
<li>
<details><summary><h3>🟨 cudax: Pass:  90%/22  | Total:  2h 08m | Avg:  5m 49s | Max: 17m 38s | Hits:  97%/10554 </h3></summary>

```
🔍 cpu: amd64 🔍
  🔍 amd64              Pass:  88%/18  | Total:  1h 56m | Avg:  6m 29s | Max: 17m 38s | Hits:  97%/8326  
  🟩 arm64              Pass: 100%/4   | Total: 11m 25s | Avg:  2m 51s | Max:  3m 07s | Hits:  99%/2228  
🚨 ctk: 12.5 🚨
  🟩 12.0               Pass: 100%/1   | Total:  9m 09s | Avg:  9m 09s | Max:  9m 09s | Hits:  61%/262   
  🔥 12.5               Pass:   0%/2   | Total: 25m 09s | Avg: 12m 34s | Max: 17m 38s
  🟩 12.8               Pass: 100%/19  | Total:  1h 34m | Avg:  4m 56s | Max: 13m 37s | Hits:  98%/10292 
🚨 cudacxx: nvcc12.5 🚨
  🟩 nvcc12.0           Pass: 100%/1   | Total:  9m 09s | Avg:  9m 09s | Max:  9m 09s | Hits:  61%/262   
  🔥 nvcc12.5           Pass:   0%/2   | Total: 25m 09s | Avg: 12m 34s | Max: 17m 38s
  🟩 nvcc12.8           Pass: 100%/19  | Total:  1h 34m | Avg:  4m 56s | Max: 13m 37s | Hits:  98%/10292 
🚨 cxx: NVHPC24.7 🚨
  🟩 Clang14            Pass: 100%/1   | Total:  3m 25s | Avg:  3m 25s | Max:  3m 25s | Hits: 100%/559   
  🟩 Clang15            Pass: 100%/1   | Total:  3m 24s | Avg:  3m 24s | Max:  3m 24s | Hits: 100%/557   
  🟩 Clang16            Pass: 100%/1   | Total:  3m 23s | Avg:  3m 23s | Max:  3m 23s | Hits: 100%/557   
  🟩 Clang17            Pass: 100%/1   | Total:  3m 20s | Avg:  3m 20s | Max:  3m 20s | Hits: 100%/557   
  🟩 Clang18            Pass: 100%/4   | Total: 20m 43s | Avg:  5m 10s | Max: 11m 37s | Hits: 100%/2228  
  🟩 GCC10              Pass: 100%/1   | Total:  3m 16s | Avg:  3m 16s | Max:  3m 16s | Hits:  99%/559   
  🟩 GCC11              Pass: 100%/1   | Total:  3m 06s | Avg:  3m 06s | Max:  3m 06s | Hits:  99%/557   
  🟩 GCC12              Pass: 100%/2   | Total: 16m 14s | Avg:  8m 07s | Max: 12m 14s | Hits:  99%/1114  
  🟩 GCC13              Pass: 100%/6   | Total: 28m 12s | Avg:  4m 42s | Max: 13m 37s | Hits:  99%/3342  
  🟩 MSVC14.39          Pass: 100%/1   | Total:  9m 09s | Avg:  9m 09s | Max:  9m 09s | Hits:  61%/262   
  🟩 MSVC14.42          Pass: 100%/1   | Total:  8m 57s | Avg:  8m 57s | Max:  8m 57s | Hits:  61%/262   
  🔥 NVHPC24.7          Pass:   0%/2   | Total: 25m 09s | Avg: 12m 34s | Max: 17m 38s
🚨 cxx_family: NVHPC 🚨
  🟩 Clang              Pass: 100%/8   | Total: 34m 15s | Avg:  4m 16s | Max: 11m 37s | Hits: 100%/4458  
  🟩 GCC                Pass: 100%/10  | Total: 50m 48s | Avg:  5m 04s | Max: 13m 37s | Hits:  99%/5572  
  🟩 MSVC               Pass: 100%/2   | Total: 18m 06s | Avg:  9m 03s | Max:  9m 09s | Hits:  61%/524   
  🔥 NVHPC              Pass:   0%/2   | Total: 25m 09s | Avg: 12m 34s | Max: 17m 38s
🔍 gpu: rtx2080 🔍
  🟩 h100               Pass: 100%/2   | Total: 16m 28s | Avg:  8m 14s | Max: 13m 37s | Hits:  99%/1114  
  🔍 rtx2080            Pass:  90%/20  | Total:  1h 51m | Avg:  5m 35s | Max: 17m 38s | Hits:  97%/9440  
🔍 jobs: Build 🔍
  🔍 Build              Pass:  89%/19  | Total:  1h 30m | Avg:  4m 46s | Max: 17m 38s | Hits:  97%/8883  
  🟩 Test               Pass: 100%/3   | Total: 37m 28s | Avg: 12m 29s | Max: 13m 37s | Hits:  99%/1671  
🟨 cudacxx_family
  🟨 nvcc               Pass:  90%/22  | Total:  2h 08m | Avg:  5m 49s | Max: 17m 38s | Hits:  97%/10554 
🟩 sm
  🟩 90                 Pass: 100%/3   | Total: 19m 18s | Avg:  6m 26s | Max: 13m 37s | Hits:  99%/1671  
  🟩 90a                Pass: 100%/1   | Total:  3m 02s | Avg:  3m 02s | Max:  3m 02s | Hits:  99%/557   
🟨 std
  🟨 17                 Pass:  75%/4   | Total: 25m 56s | Avg:  6m 29s | Max: 17m 38s | Hits:  99%/1671  
  🟨 20                 Pass:  94%/18  | Total:  1h 42m | Avg:  5m 41s | Max: 13m 37s | Hits:  97%/8883  
```

</details>

</ul>

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

### Modifications in project?

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

### Modifications in project or dependencies?

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


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

|  #   | Runner
|------|------
|   13 | `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-02-19T08:38:47Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-02-19T08:56:12Z
body: <details><summary>🟨 CI finished in 15m 31s: Pass:   9%/22  | Total:  1h 06m | Avg:  3m 00s | Max: 11m 01s | Hits:  61%/524</summary>

<ul>
<li>
<details><summary><h3>🟨 cudax: Pass:   9%/22  | Total:  1h 06m | Avg:  3m 00s | Max: 11m 01s | Hits:  61%/524   </h3></summary>

```
🟨 ctk
  🟩 12.0               Pass: 100%/1   | Total: 11m 01s | Avg: 11m 01s | Max: 11m 01s | Hits:  61%/262   
  🟥 12.5               Pass:   0%/2   | Total: 10m 44s | Avg:  5m 22s | Max:  5m 50s
  🟨 12.8               Pass:   5%/19  | Total: 44m 25s | Avg:  2m 20s | Max:  9m 11s | Hits:  61%/262   
🟨 cudacxx
  🟩 nvcc12.0           Pass: 100%/1   | Total: 11m 01s | Avg: 11m 01s | Max: 11m 01s | Hits:  61%/262   
  🟥 nvcc12.5           Pass:   0%/2   | Total: 10m 44s | Avg:  5m 22s | Max:  5m 50s
  🟨 nvcc12.8           Pass:   5%/19  | Total: 44m 25s | Avg:  2m 20s | Max:  9m 11s | Hits:  61%/262   
🟨 cxx
  🟥 Clang14            Pass:   0%/1   | Total:  2m 35s | Avg:  2m 35s | Max:  2m 35s
  🟥 Clang15            Pass:   0%/1   | Total:  2m 29s | Avg:  2m 29s | Max:  2m 29s
  🟥 Clang16            Pass:   0%/1   | Total:  2m 33s | Avg:  2m 33s | Max:  2m 33s
  🟥 Clang17            Pass:   0%/1   | Total:  2m 30s | Avg:  2m 30s | Max:  2m 30s
  🟥 Clang18            Pass:   0%/4   | Total:  6m 44s | Avg:  1m 41s | Max:  2m 33s
  🟥 GCC10              Pass:   0%/1   | Total:  2m 27s | Avg:  2m 27s | Max:  2m 27s
  🟥 GCC11              Pass:   0%/1   | Total:  2m 12s | Avg:  2m 12s | Max:  2m 12s
  🟥 GCC12              Pass:   0%/2   | Total:  2m 20s | Avg:  1m 10s | Max:  2m 20s
  🟥 GCC13              Pass:   0%/6   | Total: 11m 24s | Avg:  1m 54s | Max:  2m 35s
  🟩 MSVC14.39          Pass: 100%/1   | Total: 11m 01s | Avg: 11m 01s | Max: 11m 01s | Hits:  61%/262   
  🟩 MSVC14.42          Pass: 100%/1   | Total:  9m 11s | Avg:  9m 11s | Max:  9m 11s | Hits:  61%/262   
  🟥 NVHPC24.7          Pass:   0%/2   | Total: 10m 44s | Avg:  5m 22s | Max:  5m 50s
🟨 cxx_family
  🟥 Clang              Pass:   0%/8   | Total: 16m 51s | Avg:  2m 06s | Max:  2m 35s
  🟥 GCC                Pass:   0%/10  | Total: 18m 23s | Avg:  1m 50s | Max:  2m 35s
  🟩 MSVC               Pass: 100%/2   | Total: 20m 12s | Avg: 10m 06s | Max: 11m 01s | Hits:  61%/524   
  🟥 NVHPC              Pass:   0%/2   | Total: 10m 44s | Avg:  5m 22s | Max:  5m 50s
🟨 cudacxx_family
  🟨 nvcc               Pass:   9%/22  | Total:  1h 06m | Avg:  3m 00s | Max: 11m 01s | Hits:  61%/524   
🟨 cpu
  🟨 amd64              Pass:  11%/18  | Total: 58m 03s | Avg:  3m 13s | Max: 11m 01s | Hits:  61%/524   
  🟥 arm64              Pass:   0%/4   | Total:  8m 07s | Avg:  2m 01s | Max:  2m 06s
🟨 gpu
  🟥 h100               Pass:   0%/2   | Total:  2m 27s | Avg:  1m 13s | Max:  2m 27s
  🟨 rtx2080            Pass:  10%/20  | Total:  1h 03m | Avg:  3m 11s | Max: 11m 01s | Hits:  61%/524   
🟨 jobs
  🟨 Build              Pass:  10%/19  | Total:  1h 06m | Avg:  3m 28s | Max: 11m 01s | Hits:  61%/524   
  🟥 Test               Pass:   0%/3  
🟥 sm
  🟥 90                 Pass:   0%/3   | Total:  5m 02s | Avg:  1m 40s | Max:  2m 35s
  🟥 90a                Pass:   0%/1   | Total:  2m 26s | Avg:  2m 26s | Max:  2m 26s
🟨 std
  🟥 17                 Pass:   0%/4   | Total: 11m 34s | Avg:  2m 53s | Max:  4m 54s
  🟨 20                 Pass:  11%/18  | Total: 54m 36s | Avg:  3m 02s | Max: 11m 01s | Hits:  61%/524   
```

</details>

</ul>

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

### Modifications in project?

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

### Modifications in project or dependencies?

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


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

|  #   | Runner
|------|------
|   13 | `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-02-19T09:12:43Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-02-19T09:34:11Z
body: <details><summary>🟨 CI finished in 20m 20s: Pass:  90%/22  | Total:  2h 05m | Avg:  5m 41s | Max: 14m 42s | Hits:  97%/10554</summary>

<ul>
<li>
<details><summary><h3>🟨 cudax: Pass:  90%/22  | Total:  2h 05m | Avg:  5m 41s | Max: 14m 42s | Hits:  97%/10554 </h3></summary>

```
🔍 cpu: amd64 🔍
  🔍 amd64              Pass:  88%/18  | Total:  1h 53m | Avg:  6m 18s | Max: 14m 42s | Hits:  97%/8326  
  🟩 arm64              Pass: 100%/4   | Total: 11m 27s | Avg:  2m 51s | Max:  2m 56s | Hits:  99%/2228  
🚨 ctk: 12.5 🚨
  🟩 12.0               Pass: 100%/1   | Total:  9m 29s | Avg:  9m 29s | Max:  9m 29s | Hits:  61%/262   
  🔥 12.5               Pass:   0%/2   | Total: 21m 07s | Avg: 10m 33s | Max: 14m 42s
  🟩 12.8               Pass: 100%/19  | Total:  1h 34m | Avg:  4m 58s | Max: 13m 11s | Hits:  98%/10292 
🚨 cudacxx: nvcc12.5 🚨
  🟩 nvcc12.0           Pass: 100%/1   | Total:  9m 29s | Avg:  9m 29s | Max:  9m 29s | Hits:  61%/262   
  🔥 nvcc12.5           Pass:   0%/2   | Total: 21m 07s | Avg: 10m 33s | Max: 14m 42s
  🟩 nvcc12.8           Pass: 100%/19  | Total:  1h 34m | Avg:  4m 58s | Max: 13m 11s | Hits:  98%/10292 
🚨 cxx: NVHPC24.7 🚨
  🟩 Clang14            Pass: 100%/1   | Total:  3m 15s | Avg:  3m 15s | Max:  3m 15s | Hits:  99%/559   
  🟩 Clang15            Pass: 100%/1   | Total:  3m 34s | Avg:  3m 34s | Max:  3m 34s | Hits:  99%/557   
  🟩 Clang16            Pass: 100%/1   | Total:  3m 28s | Avg:  3m 28s | Max:  3m 28s | Hits:  99%/557   
  🟩 Clang17            Pass: 100%/1   | Total:  3m 21s | Avg:  3m 21s | Max:  3m 21s | Hits:  99%/557   
  🟩 Clang18            Pass: 100%/4   | Total: 21m 28s | Avg:  5m 22s | Max: 12m 26s | Hits:  99%/2228  
  🟩 GCC10              Pass: 100%/1   | Total:  3m 24s | Avg:  3m 24s | Max:  3m 24s | Hits:  99%/559   
  🟩 GCC11              Pass: 100%/1   | Total:  3m 19s | Avg:  3m 19s | Max:  3m 19s | Hits:  99%/557   
  🟩 GCC12              Pass: 100%/2   | Total: 16m 41s | Avg:  8m 20s | Max: 13m 11s | Hits:  99%/1114  
  🟩 GCC13              Pass: 100%/6   | Total: 26m 43s | Avg:  4m 27s | Max: 11m 19s | Hits:  99%/3342  
  🟩 MSVC14.39          Pass: 100%/1   | Total:  9m 29s | Avg:  9m 29s | Max:  9m 29s | Hits:  61%/262   
  🟩 MSVC14.42          Pass: 100%/1   | Total:  9m 15s | Avg:  9m 15s | Max:  9m 15s | Hits:  61%/262   
  🔥 NVHPC24.7          Pass:   0%/2   | Total: 21m 07s | Avg: 10m 33s | Max: 14m 42s
🚨 cxx_family: NVHPC 🚨
  🟩 Clang              Pass: 100%/8   | Total: 35m 06s | Avg:  4m 23s | Max: 12m 26s | Hits:  99%/4458  
  🟩 GCC                Pass: 100%/10  | Total: 50m 07s | Avg:  5m 00s | Max: 13m 11s | Hits:  99%/5572  
  🟩 MSVC               Pass: 100%/2   | Total: 18m 44s | Avg:  9m 22s | Max:  9m 29s | Hits:  61%/524   
  🔥 NVHPC              Pass:   0%/2   | Total: 21m 07s | Avg: 10m 33s | Max: 14m 42s
🔍 gpu: rtx2080 🔍
  🟩 h100               Pass: 100%/2   | Total: 14m 37s | Avg:  7m 18s | Max: 11m 19s | Hits:  99%/1114  
  🔍 rtx2080            Pass:  90%/20  | Total:  1h 50m | Avg:  5m 31s | Max: 14m 42s | Hits:  97%/9440  
🔍 jobs: Build 🔍
  🔍 Build              Pass:  89%/19  | Total:  1h 28m | Avg:  4m 38s | Max: 14m 42s | Hits:  97%/8883  
  🟩 Test               Pass: 100%/3   | Total: 36m 56s | Avg: 12m 18s | Max: 13m 11s | Hits:  99%/1671  
🟨 cudacxx_family
  🟨 nvcc               Pass:  90%/22  | Total:  2h 05m | Avg:  5m 41s | Max: 14m 42s | Hits:  97%/10554 
🟩 sm
  🟩 90                 Pass: 100%/3   | Total: 17m 49s | Avg:  5m 56s | Max: 11m 19s | Hits:  99%/1671  
  🟩 90a                Pass: 100%/1   | Total:  3m 02s | Avg:  3m 02s | Max:  3m 02s | Hits:  99%/557   
🟨 std
  🟨 17                 Pass:  75%/4   | Total: 15m 18s | Avg:  3m 49s | Max:  6m 25s | Hits:  99%/1671  
  🟨 20                 Pass:  94%/18  | Total:  1h 49m | Avg:  6m 05s | Max: 14m 42s | Hits:  97%/8883  
```

</details>

</ul>

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

### Modifications in project?

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

### Modifications in project or dependencies?

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


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

|  #   | Runner
|------|------
|   13 | `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-03-24T13:36:28Z
body: The problem in this PR is to actually support nvc++ as the host compiler. The root of the current problem is that we sometimes have constructs like

```
ctx.parallel_for(exec_place::host(), ...)->*[](size_t i, ...) {
    ... 
};
```

The lambda function is a host-only function, but the implementation of parallel_for only discovers at runtime that a host execution place is used, so we have (uncalled) branches trying to compute for example the occupancy of a CUDA kernel using this lambda function (which is illegal).

To solve that we need to convey the type of the execution place to detect that we only need to generate the host path. This will may also reduce compilation time. A problem remains when we have an affinity setting the current execution place, which may be a device, host, grid, ... and is only resolved at runtime. In this case the problem may still exist but it is far less probable.
author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-03-24T21:32:33Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-03-24T21:38:42Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-03-24T22:03:46Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-24T22:32:28Z
body: <details><summary>🟩 CI finished in 26m 39s: Pass: 100%/22  | Total:  2h 25m | Avg:  6m 37s | Max: 18m 19s | Hits:  95%/12244</summary>

<ul>
<li>
<details><summary><h3>🟩 cudax: Pass: 100%/22  | Total:  2h 25m | Avg:  6m 37s | Max: 18m 19s | Hits:  95%/12244 </h3></summary>

```
🟩 cpu
  🟩 amd64              Pass: 100%/18  | Total:  2h 13m | Avg:  7m 26s | Max: 18m 19s | Hits:  94%/9908  
  🟩 arm64              Pass: 100%/4   | Total: 11m 47s | Avg:  2m 56s | Max:  3m 02s | Hits:  99%/2336  
🟩 ctk
  🟩 12.0               Pass: 100%/1   | Total: 10m 20s | Avg: 10m 20s | Max: 10m 20s | Hits:  95%/282   
  🟩 12.6               Pass: 100%/2   | Total: 36m 26s | Avg: 18m 13s | Max: 18m 19s | Hits:  57%/1164  
  🟩 12.8               Pass: 100%/19  | Total:  1h 38m | Avg:  5m 12s | Max: 15m 08s | Hits:  99%/10798 
🟩 cudacxx
  🟩 nvcc12.0           Pass: 100%/1   | Total: 10m 20s | Avg: 10m 20s | Max: 10m 20s | Hits:  95%/282   
  🟩 nvcc12.6           Pass: 100%/2   | Total: 36m 26s | Avg: 18m 13s | Max: 18m 19s | Hits:  57%/1164  
  🟩 nvcc12.8           Pass: 100%/19  | Total:  1h 38m | Avg:  5m 12s | Max: 15m 08s | Hits:  99%/10798 
🟩 cudacxx_family
  🟩 nvcc               Pass: 100%/22  | Total:  2h 25m | Avg:  6m 37s | Max: 18m 19s | Hits:  95%/12244 
🟩 cxx
  🟩 Clang14            Pass: 100%/1   | Total:  3m 20s | Avg:  3m 20s | Max:  3m 20s | Hits: 100%/586   
  🟩 Clang15            Pass: 100%/1   | Total:  3m 32s | Avg:  3m 32s | Max:  3m 32s | Hits: 100%/584   
  🟩 Clang16            Pass: 100%/1   | Total:  3m 27s | Avg:  3m 27s | Max:  3m 27s | Hits: 100%/584   
  🟩 Clang17            Pass: 100%/1   | Total:  3m 42s | Avg:  3m 42s | Max:  3m 42s | Hits: 100%/584   
  🟩 Clang18            Pass: 100%/4   | Total: 21m 20s | Avg:  5m 20s | Max: 12m 11s | Hits: 100%/2336  
  🟩 GCC10              Pass: 100%/1   | Total:  3m 20s | Avg:  3m 20s | Max:  3m 20s | Hits:  99%/586   
  🟩 GCC11              Pass: 100%/1   | Total:  3m 19s | Avg:  3m 19s | Max:  3m 19s | Hits:  99%/584   
  🟩 GCC12              Pass: 100%/2   | Total: 16m 28s | Avg:  8m 14s | Max: 12m 52s | Hits:  99%/1168  
  🟩 GCC13              Pass: 100%/6   | Total: 30m 30s | Avg:  5m 05s | Max: 15m 08s | Hits:  99%/3504  
  🟩 MSVC14.39          Pass: 100%/1   | Total: 10m 20s | Avg: 10m 20s | Max: 10m 20s | Hits:  95%/282   
  🟩 MSVC14.42          Pass: 100%/1   | Total:  9m 58s | Avg:  9m 58s | Max:  9m 58s | Hits:  95%/282   
  🟩 NVHPC25.1          Pass: 100%/2   | Total: 36m 26s | Avg: 18m 13s | Max: 18m 19s | Hits:  57%/1164  
🟩 cxx_family
  🟩 Clang              Pass: 100%/8   | Total: 35m 21s | Avg:  4m 25s | Max: 12m 11s | Hits: 100%/4674  
  🟩 GCC                Pass: 100%/10  | Total: 53m 37s | Avg:  5m 21s | Max: 15m 08s | Hits:  99%/5842  
  🟩 MSVC               Pass: 100%/2   | Total: 20m 18s | Avg: 10m 09s | Max: 10m 20s | Hits:  95%/564   
  🟩 NVHPC              Pass: 100%/2   | Total: 36m 26s | Avg: 18m 13s | Max: 18m 19s | Hits:  57%/1164  
🟩 gpu
  🟩 h100               Pass: 100%/2   | Total: 18m 15s | Avg:  9m 07s | Max: 15m 08s | Hits:  99%/1168  
  🟩 rtx2080            Pass: 100%/20  | Total:  2h 07m | Avg:  6m 22s | Max: 18m 19s | Hits:  95%/11076 
🟩 jobs
  🟩 Build              Pass: 100%/19  | Total:  1h 45m | Avg:  5m 33s | Max: 18m 19s | Hits:  94%/10492 
  🟩 Test               Pass: 100%/3   | Total: 40m 11s | Avg: 13m 23s | Max: 15m 08s | Hits:  99%/1752  
🟩 sm
  🟩 90                 Pass: 100%/3   | Total: 21m 21s | Avg:  7m 07s | Max: 15m 08s | Hits:  99%/1752  
  🟩 90a                Pass: 100%/1   | Total:  3m 07s | Avg:  3m 07s | Max:  3m 07s | Hits:  99%/584   
🟩 std
  🟩 17                 Pass: 100%/4   | Total: 27m 10s | Avg:  6m 47s | Max: 18m 07s | Hits:  89%/2334  
  🟩 20                 Pass: 100%/18  | Total:  1h 58m | Avg:  6m 35s | Max: 18m 19s | Hits:  97%/9910  
```

</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: 22)</h2></summary>

|  #   | Runner
|------|------
|   13 | `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-03-25T08:25:10Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-25T08:46:19Z
body: <details><summary>🟨 CI finished in 19m 59s: Pass:   9%/22  | Total:  3h 05m | Avg:  8m 24s | Max: 19m 33s | Hits:  95%/564</summary>

<ul>
<li>
<details><summary><h3>🟨 cudax: Pass:   9%/22  | Total:  3h 05m | Avg:  8m 24s | Max: 19m 33s | Hits:  95%/564   </h3></summary>

```
🟨 ctk
  🟩 12.0               Pass: 100%/1   | Total:  9m 24s | Avg:  9m 24s | Max:  9m 24s | Hits:  95%/282   
  🟥 12.6               Pass:   0%/2   | Total: 38m 45s | Avg: 19m 22s | Max: 19m 33s
  🟨 12.8               Pass:   5%/19  | Total:  2h 16m | Avg:  7m 12s | Max:  9m 48s | Hits:  95%/282   
🟨 cudacxx
  🟩 nvcc12.0           Pass: 100%/1   | Total:  9m 24s | Avg:  9m 24s | Max:  9m 24s | Hits:  95%/282   
  🟥 nvcc12.6           Pass:   0%/2   | Total: 38m 45s | Avg: 19m 22s | Max: 19m 33s
  🟨 nvcc12.8           Pass:   5%/19  | Total:  2h 16m | Avg:  7m 12s | Max:  9m 48s | Hits:  95%/282   
🟨 cxx
  🟥 Clang14            Pass:   0%/1   | Total:  8m 30s | Avg:  8m 30s | Max:  8m 30s
  🟥 Clang15            Pass:   0%/1   | Total:  9m 01s | Avg:  9m 01s | Max:  9m 01s
  🟥 Clang16            Pass:   0%/1   | Total:  9m 48s | Avg:  9m 48s | Max:  9m 48s
  🟥 Clang17            Pass:   0%/1   | Total:  9m 32s | Avg:  9m 32s | Max:  9m 32s
  🟥 Clang18            Pass:   0%/4   | Total: 25m 16s | Avg:  6m 19s | Max:  9m 28s
  🟥 GCC10              Pass:   0%/1   | Total:  8m 51s | Avg:  8m 51s | Max:  8m 51s
  🟥 GCC11              Pass:   0%/1   | Total:  8m 40s | Avg:  8m 40s | Max:  8m 40s
  🟥 GCC12              Pass:   0%/2   | Total:  9m 36s | Avg:  4m 48s | Max:  9m 36s
  🟥 GCC13              Pass:   0%/6   | Total: 38m 38s | Avg:  6m 26s | Max:  8m 29s
  🟩 MSVC14.39          Pass: 100%/1   | Total:  9m 24s | Avg:  9m 24s | Max:  9m 24s | Hits:  95%/282   
  🟩 MSVC14.42          Pass: 100%/1   | Total:  9m 06s | Avg:  9m 06s | Max:  9m 06s | Hits:  95%/282   
  🟥 NVHPC25.1          Pass:   0%/2   | Total: 38m 45s | Avg: 19m 22s | Max: 19m 33s
🟨 cxx_family
  🟥 Clang              Pass:   0%/8   | Total:  1h 02m | Avg:  7m 45s | Max:  9m 48s
  🟥 GCC                Pass:   0%/10  | Total:  1h 05m | Avg:  6m 34s | Max:  9m 36s
  🟩 MSVC               Pass: 100%/2   | Total: 18m 30s | Avg:  9m 15s | Max:  9m 24s | Hits:  95%/564   
  🟥 NVHPC              Pass:   0%/2   | Total: 38m 45s | Avg: 19m 22s | Max: 19m 33s
🟨 cudacxx_family
  🟨 nvcc               Pass:   9%/22  | Total:  3h 05m | Avg:  8m 24s | Max: 19m 33s | Hits:  95%/564   
🟨 cpu
  🟨 amd64              Pass:  11%/18  | Total:  2h 32m | Avg:  8m 29s | Max: 19m 33s | Hits:  95%/564   
  🟥 arm64              Pass:   0%/4   | Total: 32m 13s | Avg:  8m 03s | Max:  8m 29s
🟨 gpu
  🟥 h100               Pass:   0%/2   | Total:  7m 15s | Avg:  3m 37s | Max:  7m 15s
  🟨 rtx2080            Pass:  10%/20  | Total:  2h 57m | Avg:  8m 53s | Max: 19m 33s | Hits:  95%/564   
🟨 jobs
  🟨 Build              Pass:  10%/19  | Total:  3h 05m | Avg:  9m 44s | Max: 19m 33s | Hits:  95%/564   
  🟥 Test               Pass:   0%/3  
🟥 sm
  🟥 90                 Pass:   0%/3   | Total: 14m 43s | Avg:  4m 54s | Max:  7m 28s
  🟥 90a                Pass:   0%/1   | Total:  7m 30s | Avg:  7m 30s | Max:  7m 30s
🟨 std
  🟥 17                 Pass:   0%/4   | Total: 42m 44s | Avg: 10m 41s | Max: 19m 33s
  🟨 20                 Pass:  11%/18  | Total:  2h 22m | Avg:  7m 54s | Max: 19m 12s | 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: 22)</h2></summary>

|  #   | Runner
|------|------
|   13 | `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-03-25T20:59:20Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-25T21:21:17Z
body: <details><summary>🟨 CI finished in 20m 40s: Pass:   9%/22  | Total:  3h 19m | Avg:  9m 04s | Max: 20m 10s | Hits:  54%/564</summary>

<ul>
<li>
<details><summary><h3>🟨 cudax: Pass:   9%/22  | Total:  3h 19m | Avg:  9m 04s | Max: 20m 10s | Hits:  54%/564   </h3></summary>

```
🟨 ctk
  🟩 12.0               Pass: 100%/1   | Total: 13m 10s | Avg: 13m 10s | Max: 13m 10s | Hits:  55%/282   
  🟥 12.6               Pass:   0%/2   | Total: 38m 31s | Avg: 19m 15s | Max: 20m 10s
  🟨 12.8               Pass:   5%/19  | Total:  2h 28m | Avg:  7m 47s | Max: 13m 58s | Hits:  54%/282   
🟨 cudacxx
  🟩 nvcc12.0           Pass: 100%/1   | Total: 13m 10s | Avg: 13m 10s | Max: 13m 10s | Hits:  55%/282   
  🟥 nvcc12.6           Pass:   0%/2   | Total: 38m 31s | Avg: 19m 15s | Max: 20m 10s
  🟨 nvcc12.8           Pass:   5%/19  | Total:  2h 28m | Avg:  7m 47s | Max: 13m 58s | Hits:  54%/282   
🟨 cxx
  🟥 Clang14            Pass:   0%/1   | Total:  8m 50s | Avg:  8m 50s | Max:  8m 50s
  🟥 Clang15            Pass:   0%/1   | Total:  9m 13s | Avg:  9m 13s | Max:  9m 13s
  🟥 Clang16            Pass:   0%/1   | Total: 10m 09s | Avg: 10m 09s | Max: 10m 09s
  🟥 Clang17            Pass:   0%/1   | Total: 10m 07s | Avg: 10m 07s | Max: 10m 07s
  🟥 Clang18            Pass:   0%/4   | Total: 25m 18s | Avg:  6m 19s | Max:  9m 04s
  🟥 GCC10              Pass:   0%/1   | Total: 10m 42s | Avg: 10m 42s | Max: 10m 42s
  🟥 GCC11              Pass:   0%/1   | Total: 10m 56s | Avg: 10m 56s | Max: 10m 56s
  🟥 GCC12              Pass:   0%/2   | Total: 10m 09s | Avg:  5m 04s | Max: 10m 09s
  🟥 GCC13              Pass:   0%/6   | Total: 38m 42s | Avg:  6m 27s | Max:  8m 32s
  🟩 MSVC14.39          Pass: 100%/1   | Total: 13m 10s | Avg: 13m 10s | Max: 13m 10s | Hits:  55%/282   
  🟩 MSVC14.42          Pass: 100%/1   | Total: 13m 58s | Avg: 13m 58s | Max: 13m 58s | Hits:  54%/282   
  🟥 NVHPC25.1          Pass:   0%/2   | Total: 38m 31s | Avg: 19m 15s | Max: 20m 10s
🟨 cxx_family
  🟥 Clang              Pass:   0%/8   | Total:  1h 03m | Avg:  7m 57s | Max: 10m 09s
  🟥 GCC                Pass:   0%/10  | Total:  1h 10m | Avg:  7m 02s | Max: 10m 56s
  🟩 MSVC               Pass: 100%/2   | Total: 27m 08s | Avg: 13m 34s | Max: 13m 58s | Hits:  54%/564   
  🟥 NVHPC              Pass:   0%/2   | Total: 38m 31s | Avg: 19m 15s | Max: 20m 10s
🟨 cudacxx_family
  🟨 nvcc               Pass:   9%/22  | Total:  3h 19m | Avg:  9m 04s | Max: 20m 10s | Hits:  54%/564   
🟨 cpu
  🟨 amd64              Pass:  11%/18  | Total:  2h 47m | Avg:  9m 16s | Max: 20m 10s | Hits:  54%/564   
  🟥 arm64              Pass:   0%/4   | Total: 32m 43s | Avg:  8m 10s | Max:  8m 32s
🟨 gpu
  🟥 h100               Pass:   0%/2   | Total:  7m 43s | Avg:  3m 51s | Max:  7m 43s
  🟨 rtx2080            Pass:  10%/20  | Total:  3h 12m | Avg:  9m 36s | Max: 20m 10s | Hits:  54%/564   
🟨 jobs
  🟨 Build              Pass:  10%/19  | Total:  3h 19m | Avg: 10m 30s | Max: 20m 10s | Hits:  54%/564   
  🟥 Test               Pass:   0%/3  
🟥 sm
  🟥 90                 Pass:   0%/3   | Total: 15m 04s | Avg:  5m 01s | Max:  7m 43s
  🟥 90a                Pass:   0%/1   | Total:  7m 09s | Avg:  7m 09s | Max:  7m 09s
🟨 std
  🟥 17                 Pass:   0%/4   | Total: 43m 18s | Avg: 10m 49s | Max: 20m 10s
  🟨 20                 Pass:  11%/18  | Total:  2h 36m | Avg:  8m 41s | Max: 18m 21s | Hits:  54%/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: 22)</h2></summary>

|  #   | Runner
|------|------
|   13 | `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-03-26T07:13:26Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: caugonnet
created_at: 2025-03-26T07:41:04Z
body: /ok to test
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-26T08:06:15Z
body: <details><summary>🟩 CI finished in 23m 16s: Pass: 100%/22  | Total:  2h 04m | Avg:  5m 40s | Max: 12m 42s | Hits:  98%/12244</summary>

<ul>
<li>
<details><summary><h3>🟩 cudax: Pass: 100%/22  | Total:  2h 04m | Avg:  5m 40s | Max: 12m 42s | Hits:  98%/12244 </h3></summary>

```
🟩 cpu
  🟩 amd64              Pass: 100%/18  | Total:  1h 52m | Avg:  6m 16s | Max: 12m 42s | Hits:  98%/9908  
  🟩 arm64              Pass: 100%/4   | Total: 11m 55s | Avg:  2m 58s | Max:  3m 00s | Hits:  99%/2336  
🟩 ctk
  🟩 12.0               Pass: 100%/1   | Total: 10m 40s | Avg: 10m 40s | Max: 10m 40s | Hits:  95%/282   
  🟩 12.6               Pass: 100%/2   | Total: 17m 30s | Avg:  8m 45s | Max:  9m 05s | Hits:  89%/1164  
  🟩 12.8               Pass: 100%/19  | Total:  1h 36m | Avg:  5m 05s | Max: 12m 42s | Hits:  99%/10798 
🟩 cudacxx
  🟩 nvcc12.0           Pass: 100%/1   | Total: 10m 40s | Avg: 10m 40s | Max: 10m 40s | Hits:  95%/282   
  🟩 nvcc12.6           Pass: 100%/2   | Total: 17m 30s | Avg:  8m 45s | Max:  9m 05s | Hits:  89%/1164  
  🟩 nvcc12.8           Pass: 100%/19  | Total:  1h 36m | Avg:  5m 05s | Max: 12m 42s | Hits:  99%/10798 
🟩 cudacxx_family
  🟩 nvcc               Pass: 100%/22  | Total:  2h 04m | Avg:  5m 40s | Max: 12m 42s | Hits:  98%/12244 
🟩 cxx
  🟩 Clang14            Pass: 100%/1   | Total:  3m 24s | Avg:  3m 24s | Max:  3m 24s | Hits: 100%/586   
  🟩 Clang15            Pass: 100%/1   | Total:  3m 30s | Avg:  3m 30s | Max:  3m 30s | Hits: 100%/584   
  🟩 Clang16            Pass: 100%/1   | Total:  3m 31s | Avg:  3m 31s | Max:  3m 31s | Hits: 100%/584   
  🟩 Clang17            Pass: 100%/1   | Total:  3m 29s | Avg:  3m 29s | Max:  3m 29s | Hits: 100%/584   
  🟩 Clang18            Pass: 100%/4   | Total: 21m 40s | Avg:  5m 25s | Max: 12m 14s | Hits: 100%/2336  
  🟩 GCC10              Pass: 100%/1   | Total:  3m 40s | Avg:  3m 40s | Max:  3m 40s | Hits:  99%/586   
  🟩 GCC11              Pass: 100%/1   | Total:  3m 31s | Avg:  3m 31s | Max:  3m 31s | Hits:  99%/584   
  🟩 GCC12              Pass: 100%/2   | Total: 16m 18s | Avg:  8m 09s | Max: 12m 42s | Hits:  99%/1168  
  🟩 GCC13              Pass: 100%/6   | Total: 27m 13s | Avg:  4m 32s | Max: 11m 48s | Hits:  99%/3504  
  🟩 MSVC14.39          Pass: 100%/1   | Total: 10m 40s | Avg: 10m 40s | Max: 10m 40s | Hits:  95%/282   
  🟩 MSVC14.42          Pass: 100%/1   | Total: 10m 22s | Avg: 10m 22s | Max: 10m 22s | Hits:  95%/282   
  🟩 NVHPC25.1          Pass: 100%/2   | Total: 17m 30s | Avg:  8m 45s | Max:  9m 05s | Hits:  89%/1164  
🟩 cxx_family
  🟩 Clang              Pass: 100%/8   | Total: 35m 34s | Avg:  4m 26s | Max: 12m 14s | Hits: 100%/4674  
  🟩 GCC                Pass: 100%/10  | Total: 50m 42s | Avg:  5m 04s | Max: 12m 42s | Hits:  99%/5842  
  🟩 MSVC               Pass: 100%/2   | Total: 21m 02s | Avg: 10m 31s | Max: 10m 40s | Hits:  95%/564   
  🟩 NVHPC              Pass: 100%/2   | Total: 17m 30s | Avg:  8m 45s | Max:  9m 05s | Hits:  89%/1164  
🟩 gpu
  🟩 h100               Pass: 100%/2   | Total: 14m 56s | Avg:  7m 28s | Max: 11m 48s | Hits:  99%/1168  
  🟩 rtx2080            Pass: 100%/20  | Total:  1h 49m | Avg:  5m 29s | Max: 12m 42s | Hits:  98%/11076 
🟩 jobs
  🟩 Build              Pass: 100%/19  | Total:  1h 28m | Avg:  4m 38s | Max: 10m 40s | Hits:  98%/10492 
  🟩 Test               Pass: 100%/3   | Total: 36m 44s | Avg: 12m 14s | Max: 12m 42s | Hits:  99%/1752  
🟩 sm
  🟩 90                 Pass: 100%/3   | Total: 18m 04s | Avg:  6m 01s | Max: 11m 48s | Hits:  99%/1752  
  🟩 90a                Pass: 100%/1   | Total:  3m 10s | Avg:  3m 10s | Max:  3m 10s | Hits:  99%/584   
🟩 std
  🟩 17                 Pass: 100%/4   | Total: 17m 31s | Avg:  4m 22s | Max:  8m 25s | Hits:  97%/2334  
  🟩 20                 Pass: 100%/18  | Total:  1h 47m | Avg:  5m 57s | Max: 12m 42s | Hits:  98%/9910  
```

</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: 22)</h2></summary>

|  #   | Runner
|------|------
|   13 | `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