12#include <sycl/sycl.hpp>
22template <
typename Group>
23using group_type_t = std::remove_cv_t<std::remove_reference_t<Group>>;
25template <
typename Group>
26inline constexpr bool is_sub_group_v = std::is_same_v<group_type_t<Group>, sycl::sub_group>;
28template <
typename Group,
typename T>
30 if constexpr (
requires { sg_leader_broadcast(group, value); }) {
32 return sg_leader_broadcast(group, value);
48template <
typename Group,
typename Fn,
typename... Args>
49inline constexpr void invoke_one(
const Group& group, Fn&& fn, Args&&... args) {
51 std::invoke(std::forward<Fn>(fn), std::forward<Args>(args)...);
60template <
typename Group,
typename T>
62 static_assert(std::is_trivially_copyable_v<T>,
63 "broadcast_from_leader requires T to be trivially copyable");
70template <
typename Group,
typename Fn,
typename... Args>
72 -> std::invoke_result_t<Fn, Args...> {
73 using R = std::invoke_result_t<Fn, Args...>;
74 static_assert(std::is_trivially_copyable_v<R>,
75 "invoke_one_broadcast requires return type to be trivially copyable");
79 value = std::invoke(std::forward<Fn>(fn), std::forward<Args>(args)...);
batchlas::portable:: group broadcast, shuffles and sums for any trivially copyable or complex T.
constexpr T broadcast_from_leader(const Group &group, T value)
Returns the leader's value on every work-item of group.
constexpr auto invoke_one_broadcast(const Group &group, Fn &&fn, Args &&... args) -> std::invoke_result_t< Fn, Args... >
Calls fn(args...) on the leader and returns its result on every work-item.
T group_broadcast(Group g, T x, Id... id)
sycl::group_broadcast for any trivially copyable T. Collective.
constexpr void invoke_one(const Group &group, Fn &&fn, Args &&... args)
Calls fn(args...) on the group's leader work-item only.
constexpr bool is_sub_group_v
std::remove_cv_t< std::remove_reference_t< Group > > group_type_t
constexpr T broadcast_from_leader_impl(const Group &group, T value)