summaryrefslogtreecommitdiff
path: root/lib/sycl/c++/data.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sycl/c++/data.hpp')
-rw-r--r--lib/sycl/c++/data.hpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/sycl/c++/data.hpp b/lib/sycl/c++/data.hpp
index 10c500d..50adb4f 100644
--- a/lib/sycl/c++/data.hpp
+++ b/lib/sycl/c++/data.hpp
@@ -80,6 +80,10 @@ public:
values_{nullptr}
{}
+ data(data<schema::FixedArray<Sch,Dims...>, kel::lbm::encode::Sycl<Encode>>& values__):
+ values_{&values__.at({})}
+ {}
+
data(data<Sch,Encode>* values__):
values_{values__}
{}
@@ -343,6 +347,36 @@ struct sycl_copy_helper<sch::Struct<Members...>, Encode> final {
}
};
+template<typename Sch, uint64_t... Dims, typename Encode>
+struct sycl_copy_helper<sch::FixedArray<Sch,Dims...>, Encode> final {
+ using Schema = sch::FixedArray<Sch,Dims...>;
+
+ static saw::error_or<void> copy_to_host(saw::data<Schema,encode::Sycl<Encode>>& sycl_data, saw::data<Schema,Encode>& host_data, sycl::queue& q){
+ auto host_ptr = host_data.flat_data();
+ auto sycl_ptr = sycl_data.flat_data();
+
+ static_assert(sizeof(std::decay_t<decltype(sycl_ptr)>) == sizeof(std::decay_t<decltype(host_ptr)>), "Unequal size");
+
+ q.submit([&](acpp::sycl::handler& h){
+ h.copy(sycl_ptr,host_ptr, saw::ct_multiply<uint64_t,Dims...>::value);
+ }).wait();
+ return saw::make_void();
+ }
+
+ static saw::error_or<void> copy_to_device(saw::data<Schema,Encode>& host_data, saw::data<Schema,encode::Sycl<Encode>>& sycl_data, sycl::queue& q){
+ auto host_ptr = host_data.flat_data();
+ auto sycl_ptr = sycl_data.flat_data();
+
+ static_assert(sizeof(std::decay_t<decltype(sycl_ptr)>) == sizeof(std::decay_t<decltype(host_ptr)>), "Unequal size");
+
+ q.submit([&](acpp::sycl::handler& h){
+ h.copy(host_ptr,sycl_ptr, saw::ct_multiply<uint64_t,Dims...>::value);
+ }).wait();
+ return saw::make_void();
+ }
+};
+
+
template<typename Schema, typename Encode>
struct make_chunk_struct_view_helper;