mirror of
https://github.com/barkeser2002/flower.git
synced 2026-09-25 22:58:43 +03:00
47 lines
1.2 KiB
C++
47 lines
1.2 KiB
C++
#pragma once
|
|
|
|
#include "../sycl_flow.hpp"
|
|
|
|
namespace tf {
|
|
|
|
// Function: _transform_cgh
|
|
template <typename I, typename C, typename... S>
|
|
auto syclFlow::_transform_cgh(I first, I last, C&& op, S... srcs) {
|
|
|
|
// TODO: special case N == 0?
|
|
size_t N = std::distance(first, last);
|
|
size_t B = _default_group_size(N);
|
|
|
|
return [=, op=std::forward<C>(op)] (sycl::handler& handler) mutable {
|
|
|
|
size_t _N = (N % B == 0) ? N : (N + B - N % B);
|
|
|
|
handler.parallel_for(
|
|
sycl::nd_range<1>{sycl::range<1>(_N), sycl::range<1>(B)},
|
|
[=] (sycl::nd_item<1> item) {
|
|
size_t i = item.get_global_id(0);
|
|
if(i < N) {
|
|
*(first + i) = op(*(srcs + i)...);
|
|
}
|
|
}
|
|
);
|
|
};
|
|
}
|
|
|
|
// Function: transform
|
|
template <typename I, typename C, typename... S>
|
|
syclTask syclFlow::transform(I first, I last, C&& op, S... srcs) {
|
|
return on(_transform_cgh(first, last, std::forward<C>(op), srcs...));
|
|
}
|
|
|
|
// Procedure: transform
|
|
template <typename I, typename C, typename... S>
|
|
void syclFlow::transform(
|
|
syclTask task, I first, I last, C&& op, S... srcs
|
|
) {
|
|
on(task, _transform_cgh(first, last, std::forward<C>(op), srcs...));
|
|
}
|
|
|
|
|
|
} // end of namespace tf -----------------------------------------------------
|