diff --git a/cudax/include/cuda/experimental/__multi_gpu/algorithm/reduce/reduce.h b/cudax/include/cuda/experimental/__multi_gpu/algorithm/reduce/reduce.h index 57959113593..478ae372ef6 100644 --- a/cudax/include/cuda/experimental/__multi_gpu/algorithm/reduce/reduce.h +++ b/cudax/include/cuda/experimental/__multi_gpu/algorithm/reduce/reduce.h @@ -52,6 +52,7 @@ #include #include +#include #include @@ -231,6 +232,7 @@ _CCCL_CONCEPT __indirectly_binary_reducible = _CCCL_REQUIRES_EXPR((_Fn, _Tp, _It //! element is 0. For maximum and minimum, the identity values are INT_MIN, and INT_MAX //! respectively. //! +//! @tparam _Policy The return value policy. Currently only `broadcasted_t` is supported. //! @tparam _CommRange The range of communicators. Each element must model the communicator //! concept. //! @tparam _EnvRange The range of execution environments. Each environment supplies the @@ -242,6 +244,7 @@ _CCCL_CONCEPT __indirectly_binary_reducible = _CCCL_REQUIRES_EXPR((_Fn, _Tp, _It //! element type. //! @tparam _BinaryOp The binary reduction operator type. Defaults to `::cuda::std::plus<>`. //! +//! @param[in] __policy The result policy object. //! @param[in] __comms The range of communicators. //! @param[in] __envs The range of execution environments. The execution environment must //! contain a stream. @@ -250,7 +253,8 @@ _CCCL_CONCEPT __indirectly_binary_reducible = _CCCL_REQUIRES_EXPR((_Fn, _Tp, _It //! @param[in] __init The initial value seeding each reduction. //! @param[in] __op The binary reduction operator. //! @param[in] __ident The identity element to be used in case of empty ranges. -_CCCL_TEMPLATE(class _CommRange, +_CCCL_TEMPLATE(class _Policy, + class _CommRange, class _EnvRange, class _InputRangeRange, class _OutputItRange, @@ -260,6 +264,7 @@ _CCCL_REQUIRES(__range_of_communicators<_CommRange> _CCCL_AND ::cuda::std::range __detail::__range_of_sized_random_access_ranges<_InputRangeRange> _CCCL_AND __detail::__range_of_output_iters<_OutputItRange, _Tp>) _CCCL_HOST_API void reduce( + [[maybe_unused]] const __result_policy_base<_Policy>& __policy, _CommRange&& __comms, _EnvRange&& __envs, _InputRangeRange&& __range_of_inputs, @@ -269,6 +274,9 @@ _CCCL_HOST_API void reduce( _Tp __ident = ::cuda::identity_element<_BinaryOp, _Tp>()) { static_assert(::cuda::std::ranges::sized_range<_CommRange>); + static_assert(::cuda::std::same_as<_Policy, broadcasted_t>, + "Only broadcasted results are currently supported. Please open an issue at " + "github.com/NVIDIA/cccl/issue requesting support for your specified policy."); using __properties = ::cuda::experimental::__detail::__in_range_out_it_properties<_InputRangeRange, _OutputItRange, _EnvRange>; @@ -324,6 +332,7 @@ _CCCL_HOST_API void reduce( //! output iterator)` to the range-based overload. See the range overload for further //! discussion. //! +//! @tparam _Policy The return value policy. Currently only `broadcasted_t` is supported. //! @tparam _Comm The communicator type. Must model the communicator concept. //! @tparam _Env The execution environment type. Supplies the stream and optional memory //! resource. @@ -332,6 +341,7 @@ _CCCL_HOST_API void reduce( //! @tparam _Tp The reduction and result value type. //! @tparam _BinaryOp The binary reduction operator type. Defaults to `::cuda::std::plus<>`. //! +//! @param[in] __policy The result policy object. //! @param[in] __comm The communicator. //! @param[in] __env The execution environment. Must contain a stream. //! @param[in] __input The input range to reduce. @@ -339,7 +349,8 @@ _CCCL_HOST_API void reduce( //! @param[in] __init The initial value seeding the reduction. //! @param[in] __op The binary reduction operator. //! @param[in] __ident The identity element to be used in case of empty ranges. -_CCCL_TEMPLATE(class _Comm, +_CCCL_TEMPLATE(class _Policy, + class _Comm, class _Env, class _InputRange, class _OutputIt, @@ -348,6 +359,7 @@ _CCCL_TEMPLATE(class _Comm, _CCCL_REQUIRES(__communicator<_Comm> _CCCL_AND ::cuda::std::ranges::random_access_range<_InputRange> _CCCL_AND ::cuda::std::output_iterator<_OutputIt, _Tp>) _CCCL_HOST_API void reduce( + const __result_policy_base<_Policy>& __policy, _Comm&& __comm, _Env&& __env, _InputRange&& __input, @@ -357,6 +369,7 @@ _CCCL_HOST_API void reduce( _Tp __ident = ::cuda::identity_element<_BinaryOp, _Tp>()) { ::cuda::experimental::reduce( + __policy, ::cuda::std::span<::cuda::std::remove_reference_t<_Comm>, 1>{::cuda::std::addressof(__comm), 1}, ::cuda::std::span<::cuda::std::remove_reference_t<_Env>, 1>{::cuda::std::addressof(__env), 1}, ::cuda::std::span<::cuda::std::remove_reference_t<_InputRange>, 1>{::cuda::std::addressof(__input), 1}, diff --git a/cudax/include/cuda/experimental/__multi_gpu/algorithm/scan/scan.h b/cudax/include/cuda/experimental/__multi_gpu/algorithm/scan/scan.h index 19f597cb2fa..4c6b303347d 100644 --- a/cudax/include/cuda/experimental/__multi_gpu/algorithm/scan/scan.h +++ b/cudax/include/cuda/experimental/__multi_gpu/algorithm/scan/scan.h @@ -47,6 +47,7 @@ #include #include #include +#include #include @@ -65,6 +66,7 @@ enum class __kind : ::cuda::std::uint8_t }; template <__kind _Kind, + class _Policy, class _CommRange, class _EnvRange, class _InputRangeRange, @@ -72,6 +74,7 @@ template <__kind _Kind, class _Tp, class _BinaryOp> _CCCL_HOST_API void __scan( + const __result_policy_base<_Policy>&, _CommRange&& __comms, _EnvRange&& __envs, _InputRangeRange&& __range_of_inputs, @@ -81,6 +84,9 @@ _CCCL_HOST_API void __scan( _Tp __ident) { static_assert(::cuda::std::ranges::sized_range<_CommRange>); + static_assert(::cuda::std::same_as<_Policy, distributed_t>, + "Only distributed results are currently supported. Please open an issue at " + "github.com/NVIDIA/cccl/issue requesting support for your specified policy."); using __properties = ::cuda::experimental::__detail::__in_range_out_it_properties<_InputRangeRange, _OutputItRange, _EnvRange>; @@ -251,6 +257,7 @@ _CCCL_HOST_API void __scan( //! Each environment supplies the stream and optional memory resource for its local rank. The //! results are ready after the work enqueued on the corresponding streams completes. //! +//! @tparam _Policy The return value policy. Currently only `distributed_t` is supported. //! @tparam _CommRange The range of communicators. Each element must model the communicator //! concept. //! @tparam _EnvRange The range of execution environments. @@ -260,6 +267,7 @@ _CCCL_HOST_API void __scan( //! @tparam _Tp The scan value type. Deduced by default from the input element type. //! @tparam _BinaryOp The binary scan operator type. Defaults to `::cuda::std::plus<>`. //! +//! @param[in] __policy The result policy object. //! @param[in] __comms The range of communicators. //! @param[in] __envs The range of execution environments. Each environment must contain a //! stream. @@ -268,7 +276,8 @@ _CCCL_HOST_API void __scan( //! @param[in] __init The initial value for the scan. //! @param[in] __op The associative binary scan operator. //! @param[in] __ident The identity element for `__op`. -_CCCL_TEMPLATE(class _CommRange, +_CCCL_TEMPLATE(class _Policy, + class _CommRange, class _EnvRange, class _InputRangeRange, class _OutputItRange, @@ -278,6 +287,7 @@ _CCCL_REQUIRES(__range_of_communicators<_CommRange> _CCCL_AND ::cuda::std::range __detail::__range_of_sized_random_access_ranges<_InputRangeRange> _CCCL_AND __detail::__range_of_output_iters<_OutputItRange, _Tp>) _CCCL_HOST_API void exclusive_scan( + const __result_policy_base<_Policy>& __policy, _CommRange&& __comms, _EnvRange&& __envs, _InputRangeRange&& __range_of_inputs, @@ -287,6 +297,7 @@ _CCCL_HOST_API void exclusive_scan( _Tp __ident = ::cuda::identity_element<_BinaryOp, _Tp>()) { ::cuda::experimental::__detail::__scan::__scan<::cuda::experimental::__detail::__scan::__kind::__exclusive>( + __policy, ::cuda::std::forward<_CommRange>(__comms), ::cuda::std::forward<_EnvRange>(__envs), ::cuda::std::forward<_InputRangeRange>(__range_of_inputs), @@ -318,6 +329,7 @@ _CCCL_HOST_API void exclusive_scan( //! The environment supplies the stream and optional memory resource for the local rank. The //! results are ready after the work enqueued on that stream completes. //! +//! @tparam _Policy The return value policy. Currently only `distributed_t` is supported. //! @tparam _Comm The communicator type. Must model the communicator concept. //! @tparam _Env The execution environment type. Supplies the stream and optional memory //! resource. @@ -326,6 +338,7 @@ _CCCL_HOST_API void exclusive_scan( //! @tparam _Tp The scan value type. Deduced by default from the input element type. //! @tparam _BinaryOp The binary scan operator type. Defaults to `::cuda::std::plus<>`. //! +//! @param[in] __policy The result policy object. //! @param[in] __comm The communicator. //! @param[in] __env The execution environment. Must contain a stream. //! @param[in] __input The input range to scan. @@ -333,7 +346,8 @@ _CCCL_HOST_API void exclusive_scan( //! @param[in] __init The initial value for the scan. //! @param[in] __op The associative binary scan operator. //! @param[in] __ident The identity element for `__op`. -_CCCL_TEMPLATE(class _Comm, +_CCCL_TEMPLATE(class _Policy, + class _Comm, class _Env, class _InputRange, class _OutputIt, @@ -342,6 +356,7 @@ _CCCL_TEMPLATE(class _Comm, _CCCL_REQUIRES(__communicator<_Comm> _CCCL_AND ::cuda::std::ranges::random_access_range<_InputRange> _CCCL_AND ::cuda::std::output_iterator<_OutputIt, _Tp>) _CCCL_HOST_API void exclusive_scan( + const __result_policy_base<_Policy>& __policy, _Comm&& __comm, _Env&& __env, _InputRange&& __input, @@ -351,6 +366,7 @@ _CCCL_HOST_API void exclusive_scan( _Tp __ident = ::cuda::identity_element<_BinaryOp, _Tp>()) { ::cuda::experimental::exclusive_scan( + __policy, ::cuda::std::span<::cuda::std::remove_reference_t<_Comm>, 1>{::cuda::std::addressof(__comm), 1}, ::cuda::std::span<::cuda::std::remove_reference_t<_Env>, 1>{::cuda::std::addressof(__env), 1}, ::cuda::std::span<::cuda::std::remove_reference_t<_InputRange>, 1>{::cuda::std::addressof(__input), 1}, @@ -388,6 +404,7 @@ _CCCL_HOST_API void exclusive_scan( //! Each environment supplies the stream and optional memory resource for its local rank. The //! results are ready after the work enqueued on the corresponding streams completes. //! +//! @tparam _Policy The return value policy. Currently only `distributed_t` is supported. //! @tparam _CommRange The range of communicators. Each element must model the communicator //! concept. //! @tparam _EnvRange The range of execution environments. @@ -397,6 +414,7 @@ _CCCL_HOST_API void exclusive_scan( //! @tparam _Tp The scan value type. Deduced by default from the input element type. //! @tparam _BinaryOp The binary scan operator type. Defaults to `::cuda::std::plus<>`. //! +//! @param[in] __policy The result policy object. //! @param[in] __comms The range of communicators. //! @param[in] __envs The range of execution environments. Each environment must contain a //! stream. @@ -405,7 +423,8 @@ _CCCL_HOST_API void exclusive_scan( //! @param[in] __init The initial value for the scan. //! @param[in] __op The associative binary scan operator. //! @param[in] __ident The identity element for `__op`. -_CCCL_TEMPLATE(class _CommRange, +_CCCL_TEMPLATE(class _Policy, + class _CommRange, class _EnvRange, class _InputRangeRange, class _OutputItRange, @@ -415,6 +434,7 @@ _CCCL_REQUIRES(__range_of_communicators<_CommRange> _CCCL_AND ::cuda::std::range __detail::__range_of_sized_random_access_ranges<_InputRangeRange> _CCCL_AND __detail::__range_of_output_iters<_OutputItRange, _Tp>) _CCCL_HOST_API void inclusive_scan( + const __result_policy_base<_Policy>& __policy, _CommRange&& __comms, _EnvRange&& __envs, _InputRangeRange&& __range_of_inputs, @@ -424,6 +444,7 @@ _CCCL_HOST_API void inclusive_scan( _Tp __ident = ::cuda::identity_element<_BinaryOp, _Tp>()) { ::cuda::experimental::__detail::__scan::__scan<::cuda::experimental::__detail::__scan::__kind::__inclusive>( + __policy, ::cuda::std::forward<_CommRange>(__comms), ::cuda::std::forward<_EnvRange>(__envs), ::cuda::std::forward<_InputRangeRange>(__range_of_inputs), @@ -455,6 +476,7 @@ _CCCL_HOST_API void inclusive_scan( //! The environment supplies the stream and optional memory resource for the local rank. The //! results are ready after the work enqueued on that stream completes. //! +//! @tparam _Policy The return value policy. Currently only `distributed_t` is supported. //! @tparam _Comm The communicator type. Must model the communicator concept. //! @tparam _Env The execution environment type. Supplies the stream and optional memory //! resource. @@ -463,6 +485,7 @@ _CCCL_HOST_API void inclusive_scan( //! @tparam _Tp The scan value type. Deduced by default from the input element type. //! @tparam _BinaryOp The binary scan operator type. Defaults to `::cuda::std::plus<>`. //! +//! @param[in] __policy The result policy object. //! @param[in] __comm The communicator. //! @param[in] __env The execution environment. Must contain a stream. //! @param[in] __input The input range to scan. @@ -470,7 +493,8 @@ _CCCL_HOST_API void inclusive_scan( //! @param[in] __init The initial value for the scan. //! @param[in] __op The associative binary scan operator. //! @param[in] __ident The identity element for `__op`. -_CCCL_TEMPLATE(class _Comm, +_CCCL_TEMPLATE(class _Policy, + class _Comm, class _Env, class _InputRange, class _OutputIt, @@ -479,6 +503,7 @@ _CCCL_TEMPLATE(class _Comm, _CCCL_REQUIRES(__communicator<_Comm> _CCCL_AND ::cuda::std::ranges::random_access_range<_InputRange> _CCCL_AND ::cuda::std::output_iterator<_OutputIt, _Tp>) _CCCL_HOST_API void inclusive_scan( + const __result_policy_base<_Policy>& __policy, _Comm&& __comm, _Env&& __env, _InputRange&& __input, @@ -488,6 +513,7 @@ _CCCL_HOST_API void inclusive_scan( _Tp __ident = ::cuda::identity_element<_BinaryOp, _Tp>()) { ::cuda::experimental::inclusive_scan( + __policy, ::cuda::std::span<::cuda::std::remove_reference_t<_Comm>, 1>{::cuda::std::addressof(__comm), 1}, ::cuda::std::span<::cuda::std::remove_reference_t<_Env>, 1>{::cuda::std::addressof(__env), 1}, ::cuda::std::span<::cuda::std::remove_reference_t<_InputRange>, 1>{::cuda::std::addressof(__input), 1}, diff --git a/cudax/test/multi_gpu/algorithms/exclusive_scan/range_basic.cu b/cudax/test/multi_gpu/algorithms/exclusive_scan/range_basic.cu index e3057f43e1a..0c8df2f111d 100644 --- a/cudax/test/multi_gpu/algorithms/exclusive_scan/range_basic.cu +++ b/cudax/test/multi_gpu/algorithms/exclusive_scan/range_basic.cu @@ -123,7 +123,7 @@ void do_exclusive_scan( INFO("init = " << init); INFO("ident = " << ident); - cudax::exclusive_scan(comms, envs, in, outputs, init, op, ident); + cudax::exclusive_scan(cudax::distributed, comms, envs, in, outputs, init, op, ident); // cuda::std::execution::env has no operator==, so we can only compare the sizes. REQUIRE(envs.size() == envs_size); @@ -167,6 +167,7 @@ MULTI_GPU_TEST("exclusive_scan documentation example", c2h::type_list) std::vector::iterator> output_iterators = make_output_iterators(outputs); cudax::exclusive_scan( + cudax::distributed, comms, // Passing streams as the environment directly streams, diff --git a/cudax/test/multi_gpu/algorithms/exclusive_scan/range_defaults.cu b/cudax/test/multi_gpu/algorithms/exclusive_scan/range_defaults.cu index 08274c68634..5928a132b05 100644 --- a/cudax/test/multi_gpu/algorithms/exclusive_scan/range_defaults.cu +++ b/cudax/test/multi_gpu/algorithms/exclusive_scan/range_defaults.cu @@ -88,25 +88,25 @@ MULTI_GPU_TEST("exclusive_scan, range overloads default values", ) SECTION("Default init, op, ident (all)") { - cudax::exclusive_scan(comms, envs, in, outputs); + cudax::exclusive_scan(cudax::distributed, comms, envs, in, outputs); check_outputs(); } SECTION("Default op, ident") { - cudax::exclusive_scan(comms, envs, in, outputs, init); + cudax::exclusive_scan(cudax::distributed, comms, envs, in, outputs, init); check_outputs(); } SECTION("Default ident") { - cudax::exclusive_scan(comms, envs, in, outputs, init, op); + cudax::exclusive_scan(cudax::distributed, comms, envs, in, outputs, init, op); check_outputs(); } SECTION("Default none") { - cudax::exclusive_scan(comms, envs, in, outputs, init, op, ident); + cudax::exclusive_scan(cudax::distributed, comms, envs, in, outputs, init, op, ident); check_outputs(); } } diff --git a/cudax/test/multi_gpu/algorithms/exclusive_scan/single_comm_basic.cu b/cudax/test/multi_gpu/algorithms/exclusive_scan/single_comm_basic.cu index e90ec217805..e5abc6145af 100644 --- a/cudax/test/multi_gpu/algorithms/exclusive_scan/single_comm_basic.cu +++ b/cudax/test/multi_gpu/algorithms/exclusive_scan/single_comm_basic.cu @@ -139,7 +139,7 @@ void run_case(cuda::std::span comms, INFO("ident = " << ident); run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::exclusive_scan(comms[i], envs[i], in[i], outputs[i], init, op, ident); + cudax::exclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i], init, op, ident); }); REQUIRE(in.size() == in_copy.size()); @@ -184,7 +184,7 @@ MULTI_GPU_TEST("exclusive_scan single-comm documentation example", c2h::type_lis auto input = cuda::make_device_buffer(environment, device, input_values); auto output = cuda::make_device_buffer(environment, device, input_values.size(), cuda::no_init); - cudax::exclusive_scan(communicator, environment, input, output.begin(), /*__init=*/0); + cudax::exclusive_scan(cudax::distributed, communicator, environment, input, output.begin(), /*__init=*/0); // Every rank contributes {1, 2}, so rank r starts with a prefix of 3 * r. const auto rank = communicator.rank(); diff --git a/cudax/test/multi_gpu/algorithms/exclusive_scan/single_comm_defaults.cu b/cudax/test/multi_gpu/algorithms/exclusive_scan/single_comm_defaults.cu index 9642fc0375c..1f81e74f558 100644 --- a/cudax/test/multi_gpu/algorithms/exclusive_scan/single_comm_defaults.cu +++ b/cudax/test/multi_gpu/algorithms/exclusive_scan/single_comm_defaults.cu @@ -89,7 +89,7 @@ MULTI_GPU_TEST("exclusive_scan single-comm, overloads default values", ) SECTION("Default init, op, ident (all)") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::exclusive_scan(comms[i], envs[i], in[i], outputs[i]); + cudax::exclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i]); }); check_outputs(); } @@ -97,7 +97,7 @@ MULTI_GPU_TEST("exclusive_scan single-comm, overloads default values", ) SECTION("Default op, ident") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::exclusive_scan(comms[i], envs[i], in[i], outputs[i], init); + cudax::exclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i], init); }); check_outputs(); } @@ -105,7 +105,7 @@ MULTI_GPU_TEST("exclusive_scan single-comm, overloads default values", ) SECTION("Default ident") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::exclusive_scan(comms[i], envs[i], in[i], outputs[i], init, op); + cudax::exclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i], init, op); }); check_outputs(); } @@ -113,7 +113,7 @@ MULTI_GPU_TEST("exclusive_scan single-comm, overloads default values", ) SECTION("Default none") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::exclusive_scan(comms[i], envs[i], in[i], outputs[i], init, op, ident); + cudax::exclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i], init, op, ident); }); check_outputs(); } diff --git a/cudax/test/multi_gpu/algorithms/inclusive_scan/range_basic.cu b/cudax/test/multi_gpu/algorithms/inclusive_scan/range_basic.cu index ac2d2e64c0d..9260479484a 100644 --- a/cudax/test/multi_gpu/algorithms/inclusive_scan/range_basic.cu +++ b/cudax/test/multi_gpu/algorithms/inclusive_scan/range_basic.cu @@ -138,7 +138,7 @@ void do_inclusive_scan( INFO("init = " << init); INFO("ident = " << ident); - cudax::inclusive_scan(comms, envs, in, outputs, init, op, ident); + cudax::inclusive_scan(cudax::distributed, comms, envs, in, outputs, init, op, ident); // cuda::std::execution::env has no operator==, so we can only compare the sizes. REQUIRE(envs.size() == envs_size); @@ -182,6 +182,7 @@ MULTI_GPU_TEST("inclusive_scan documentation example", c2h::type_list) std::vector::iterator> output_iterators = make_output_iterators(outputs); cudax::inclusive_scan( + cudax::distributed, comms, // Passing streams as the environment directly streams, diff --git a/cudax/test/multi_gpu/algorithms/inclusive_scan/range_defaults.cu b/cudax/test/multi_gpu/algorithms/inclusive_scan/range_defaults.cu index 4361f3346c4..e17a15744e9 100644 --- a/cudax/test/multi_gpu/algorithms/inclusive_scan/range_defaults.cu +++ b/cudax/test/multi_gpu/algorithms/inclusive_scan/range_defaults.cu @@ -88,25 +88,25 @@ MULTI_GPU_TEST("inclusive_scan, range overloads default values", ) SECTION("Default init, op, ident (all)") { - cudax::inclusive_scan(comms, envs, in, outputs); + cudax::inclusive_scan(cudax::distributed, comms, envs, in, outputs); check_outputs(); } SECTION("Default op, ident") { - cudax::inclusive_scan(comms, envs, in, outputs, init); + cudax::inclusive_scan(cudax::distributed, comms, envs, in, outputs, init); check_outputs(); } SECTION("Default ident") { - cudax::inclusive_scan(comms, envs, in, outputs, init, op); + cudax::inclusive_scan(cudax::distributed, comms, envs, in, outputs, init, op); check_outputs(); } SECTION("Default none") { - cudax::inclusive_scan(comms, envs, in, outputs, init, op, ident); + cudax::inclusive_scan(cudax::distributed, comms, envs, in, outputs, init, op, ident); check_outputs(); } } diff --git a/cudax/test/multi_gpu/algorithms/inclusive_scan/single_comm_basic.cu b/cudax/test/multi_gpu/algorithms/inclusive_scan/single_comm_basic.cu index 2ffb14a1338..312591536e3 100644 --- a/cudax/test/multi_gpu/algorithms/inclusive_scan/single_comm_basic.cu +++ b/cudax/test/multi_gpu/algorithms/inclusive_scan/single_comm_basic.cu @@ -154,7 +154,7 @@ void run_case(cuda::std::span comms, INFO("ident = " << ident); run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::inclusive_scan(comms[i], envs[i], in[i], outputs[i], init, op, ident); + cudax::inclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i], init, op, ident); }); REQUIRE(in.size() == in_copy.size()); @@ -199,7 +199,7 @@ MULTI_GPU_TEST("inclusive_scan single-comm documentation example", c2h::type_lis auto input = cuda::make_device_buffer(environment, device, input_values); auto output = cuda::make_device_buffer(environment, device, input_values.size(), cuda::no_init); - cudax::inclusive_scan(communicator, environment, input, output.begin(), /*__init=*/0); + cudax::inclusive_scan(cudax::distributed, communicator, environment, input, output.begin(), /*__init=*/0); // Every rank contributes {1, 2}, so rank r starts with a prefix of 3 * r. const auto rank = communicator.rank(); diff --git a/cudax/test/multi_gpu/algorithms/inclusive_scan/single_comm_defaults.cu b/cudax/test/multi_gpu/algorithms/inclusive_scan/single_comm_defaults.cu index eb6ed8e6509..022b6346e2f 100644 --- a/cudax/test/multi_gpu/algorithms/inclusive_scan/single_comm_defaults.cu +++ b/cudax/test/multi_gpu/algorithms/inclusive_scan/single_comm_defaults.cu @@ -89,7 +89,7 @@ MULTI_GPU_TEST("inclusive_scan single-comm, overloads default values", ) SECTION("Default init, op, ident (all)") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::inclusive_scan(comms[i], envs[i], in[i], outputs[i]); + cudax::inclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i]); }); check_outputs(); } @@ -97,7 +97,7 @@ MULTI_GPU_TEST("inclusive_scan single-comm, overloads default values", ) SECTION("Default op, ident") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::inclusive_scan(comms[i], envs[i], in[i], outputs[i], init); + cudax::inclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i], init); }); check_outputs(); } @@ -105,7 +105,7 @@ MULTI_GPU_TEST("inclusive_scan single-comm, overloads default values", ) SECTION("Default ident") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::inclusive_scan(comms[i], envs[i], in[i], outputs[i], init, op); + cudax::inclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i], init, op); }); check_outputs(); } @@ -113,7 +113,7 @@ MULTI_GPU_TEST("inclusive_scan single-comm, overloads default values", ) SECTION("Default none") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::inclusive_scan(comms[i], envs[i], in[i], outputs[i], init, op, ident); + cudax::inclusive_scan(cudax::distributed, comms[i], envs[i], in[i], outputs[i], init, op, ident); }); check_outputs(); } diff --git a/cudax/test/multi_gpu/algorithms/reduce/range_basic.cu b/cudax/test/multi_gpu/algorithms/reduce/range_basic.cu index 548bf7b48bc..8a85f91e694 100644 --- a/cudax/test/multi_gpu/algorithms/reduce/range_basic.cu +++ b/cudax/test/multi_gpu/algorithms/reduce/range_basic.cu @@ -93,7 +93,7 @@ void do_reduce(cuda::std::span comms, INFO("init = " << init); INFO("ident = " << ident); - cudax::reduce(comms, envs, in, outputs, init, op, ident); + cudax::reduce(cudax::broadcasted, comms, envs, in, outputs, init, op, ident); // cuda::std::execution::env has no operator==, so we can only compare the sizes. REQUIRE(envs.size() == envs_size); diff --git a/cudax/test/multi_gpu/algorithms/reduce/range_defaults.cu b/cudax/test/multi_gpu/algorithms/reduce/range_defaults.cu index a3b7bd9f7a5..5995349d385 100644 --- a/cudax/test/multi_gpu/algorithms/reduce/range_defaults.cu +++ b/cudax/test/multi_gpu/algorithms/reduce/range_defaults.cu @@ -70,7 +70,7 @@ MULTI_GPU_TEST("reduce, range overloads default values", ) SECTION("Default init, op, ident (all)") { - cudax::reduce(comms, envs, in, outputs); + cudax::reduce(cudax::broadcasted, comms, envs, in, outputs); for (const auto& buf : out) { @@ -80,7 +80,7 @@ MULTI_GPU_TEST("reduce, range overloads default values", ) SECTION("Default op, ident") { - cudax::reduce(comms, envs, in, outputs, init); + cudax::reduce(cudax::broadcasted, comms, envs, in, outputs, init); for (const auto& buf : out) { @@ -90,7 +90,7 @@ MULTI_GPU_TEST("reduce, range overloads default values", ) SECTION("Default ident") { - cudax::reduce(comms, envs, in, outputs, init, op); + cudax::reduce(cudax::broadcasted, comms, envs, in, outputs, init, op); for (const auto& buf : out) { @@ -100,7 +100,7 @@ MULTI_GPU_TEST("reduce, range overloads default values", ) SECTION("Default none") { - cudax::reduce(comms, envs, in, outputs, init, op, ident); + cudax::reduce(cudax::broadcasted, comms, envs, in, outputs, init, op, ident); for (const auto& buf : out) { diff --git a/cudax/test/multi_gpu/algorithms/reduce/single_comm_basic.cu b/cudax/test/multi_gpu/algorithms/reduce/single_comm_basic.cu index 91c0707c6b5..25598a07329 100644 --- a/cudax/test/multi_gpu/algorithms/reduce/single_comm_basic.cu +++ b/cudax/test/multi_gpu/algorithms/reduce/single_comm_basic.cu @@ -100,7 +100,7 @@ void do_reduce_threaded( INFO("ident = " << ident); run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::reduce(comms[i], envs[i], in[i], outputs[i], init, op, ident); + cudax::reduce(cudax::broadcasted, comms[i], envs[i], in[i], outputs[i], init, op, ident); }); // Reduction call should not modify the inputs in any ways diff --git a/cudax/test/multi_gpu/algorithms/reduce/single_comm_defaults.cu b/cudax/test/multi_gpu/algorithms/reduce/single_comm_defaults.cu index c3608b556b2..bf705c0acb8 100644 --- a/cudax/test/multi_gpu/algorithms/reduce/single_comm_defaults.cu +++ b/cudax/test/multi_gpu/algorithms/reduce/single_comm_defaults.cu @@ -73,7 +73,7 @@ MULTI_GPU_TEST("reduce single-comm, overloads default values", ) SECTION("Default init, op, ident (all)") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::reduce(comms[i], envs[i], in[i], outputs[i]); + cudax::reduce(cudax::broadcasted, comms[i], envs[i], in[i], outputs[i]); }); for (const auto& buf : out) @@ -85,7 +85,7 @@ MULTI_GPU_TEST("reduce single-comm, overloads default values", ) SECTION("Default op, ident") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::reduce(comms[i], envs[i], in[i], outputs[i], init); + cudax::reduce(cudax::broadcasted, comms[i], envs[i], in[i], outputs[i], init); }); for (const auto& buf : out) @@ -97,7 +97,7 @@ MULTI_GPU_TEST("reduce single-comm, overloads default values", ) SECTION("Default ident") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::reduce(comms[i], envs[i], in[i], outputs[i], init, op); + cudax::reduce(cudax::broadcasted, comms[i], envs[i], in[i], outputs[i], init, op); }); for (const auto& buf : out) @@ -109,7 +109,7 @@ MULTI_GPU_TEST("reduce single-comm, overloads default values", ) SECTION("Default none") { run_threaded(comms.size(), [&](cuda::std::size_t i) { - cudax::reduce(comms[i], envs[i], in[i], outputs[i], init, op, ident); + cudax::reduce(cudax::broadcasted, comms[i], envs[i], in[i], outputs[i], init, op, ident); }); for (const auto& buf : out)