From 0a8dd2541e20f59812db21e8bad069b50cf8ebaf Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Fri, 23 Jan 2026 12:04:35 +0100 Subject: Preparing for SYCL accesors --- default.nix | 2 +- examples/poiseulle_particles_2d_gpu/sim.cpp | 63 +++++++-- lib/core/c++/chunk.hpp | 14 +- lib/core/c++/flatten.hpp | 2 - lib/sycl/c++/data.hpp | 205 +++++++++++++++++++++++----- lib/sycl/tests/data.cpp | 17 ++- 6 files changed, 252 insertions(+), 51 deletions(-) diff --git a/default.nix b/default.nix index a8ec430..fd36323 100644 --- a/default.nix +++ b/default.nix @@ -39,7 +39,7 @@ let forstio = (import ((builtins.fetchTarball { url = "https://git.keldu.de/forstio-forstio/snapshot/master.tar.gz"; - sha256 = "sha256:09xxs9dlnd52k1082lb5p034ik4jfg9zd5zc1x5da2clqhdb6s4m"; + sha256 = "sha256:0078544k33h6ihhzz1150xs9zcywdmb6y8p16038v488kblvh3nc"; }) + "/default.nix"){ inherit stdenv; inherit clang-tools; diff --git a/examples/poiseulle_particles_2d_gpu/sim.cpp b/examples/poiseulle_particles_2d_gpu/sim.cpp index be6b4f0..9646b0a 100644 --- a/examples/poiseulle_particles_2d_gpu/sim.cpp +++ b/examples/poiseulle_particles_2d_gpu/sim.cpp @@ -7,8 +7,8 @@ namespace kel { namespace lbm { -constexpr uint64_t dim_x = 16u; -constexpr uint64_t dim_y = 4u; +constexpr uint64_t dim_x = 256u; +constexpr uint64_t dim_y = 16u; namespace sch { using namespace saw::schema; @@ -31,29 +31,29 @@ using DfChunk = Chunk, 1u, dim_x, dim_y>; template using ChunkStruct = Struct< Member + //,Member, "dfs"> >; - } template saw::error_or setup_initial_conditions(saw::data>& fields){ - auto& info_f = fields.get<"info">(); + auto& info_f = fields.template get<"info">(); // Set everything as walls iterator::apply( [&](auto& index){ info_f.at(index).set(2u); }, - {{0u,0u}}, - {{dim_x, dim_y}}, - {{0u,0u}} + {}, + info_f.get_dims(), + {} ); // Fluid iterator::apply( [&](auto& index){ info_f.at(index).set(1u); }, - {{0u,0u}}, - {{dim_x, dim_y}}, + {}, + info_f.get_dims(), {{1u,1u}} ); @@ -76,12 +76,30 @@ saw::error_or setup_initial_conditions(saw::data> {{dim_x, dim_y}}, {{0u,1u}} ); +/* + // + auto& df_f = fields.template get<"dfs">(); + saw::data rho{1}; + saw::data> vel{}; + auto eq = equilibrium(rho,vel); + + iterator::apply( + [&](auto& index){ + auto& df = df_f.at(index); + + df = eq; + }, + {},// 0-index + df_f.get_dims() + ); +*/ return saw::make_void(); } template -saw::error_or step(){ +saw::error_or step(saw::data,encode::Sycl>& fields, saw::data t_i, device& dev){ + auto& q = dev.get_handle(); return saw::make_void(); } @@ -111,7 +129,9 @@ saw::error_or lbm_main(int argc, char** argv){ // saw::data> meta{{dim_x,dim_y}}; saw::data> lbm_data{}; - acpp::sycl::queue sycl_q; + device dev; + auto& sycl_q = dev.get_handle(); + sycl_q.wait(); { auto eov = setup_initial_conditions(lbm_data); @@ -120,6 +140,27 @@ saw::error_or lbm_main(int argc, char** argv){ } } + saw::data, encode::Sycl> lbm_sycl_data; + { + auto eov = dev.allocate_on_device(lbm_sycl_data); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = dev.copy_to_device(lbm_data,lbm_sycl_data); + if(eov.is_error()){ + return eov; + } + } + + for(saw::data i{0u}; i < saw::data{32ul}; ++i){ + auto eov = step(lbm_sycl_data,i,dev); + if(eov.is_error()){ + return eov; + } + } + /* iterator::apply( [&](auto& index){ diff --git a/lib/core/c++/chunk.hpp b/lib/core/c++/chunk.hpp index ad7de34..6b028ba 100644 --- a/lib/core/c++/chunk.hpp +++ b/lib/core/c++/chunk.hpp @@ -47,7 +47,7 @@ public: data& ghost_at(const data>& index){ return values_.at(index); } - + const data& ghost_at(const data>& index) const { return values_.at(index); } @@ -55,7 +55,7 @@ public: static constexpr auto get_ghost_dims() { return data::get_dims(); } - + data& at(const data>& index){ std::decay_t ind; for(uint64_t i = 0u; i < sizeof...(Sides); ++i){ @@ -63,7 +63,7 @@ public: } return values_.at(ind); } - + const data& at(const data>& index) const { std::decay_t ind; for(uint64_t i = 0u; i < sizeof...(Sides); ++i){ @@ -75,6 +75,14 @@ public: static constexpr auto get_dims(){ return data,Encode>{{Sides...}}; } + + auto flat_data(){ + return values_.flat_data(); + } + + static constexpr auto flat_size() { + return data::flat_size(); + } }; template diff --git a/lib/core/c++/flatten.hpp b/lib/core/c++/flatten.hpp index 164bb77..1609589 100644 --- a/lib/core/c++/flatten.hpp +++ b/lib/core/c++/flatten.hpp @@ -20,7 +20,6 @@ public: return 1u; } - private: /// 2,3,4 => 2,6,24 /// i + j * 2 + k * 3*2 @@ -35,7 +34,6 @@ private: public: static saw::data apply(const saw::data>& index, const saw::data>& meta){ saw::data flat_ind{0u}; - apply_i<0u>(flat_ind, index, meta); return flat_ind; } diff --git a/lib/sycl/c++/data.hpp b/lib/sycl/c++/data.hpp index bb8b4bf..d9976dd 100644 --- a/lib/sycl/c++/data.hpp +++ b/lib/sycl/c++/data.hpp @@ -11,19 +11,115 @@ struct Sycl { }; } +/* namespace impl { template struct struct_has_only_equal_dimension_array{}; } +*/ } } namespace saw { +template +class data, kel::lbm::encode::Sycl> final { +public: + using Schema = schema::FixedArray; +private: + acpp::sycl::queue* q_; + data* values_; + + SAW_FORBID_COPY(data); +public: + data(acpp::sycl::queue& q__): + q_{&q__}, + values_{nullptr} + { + values_ = acpp::sycl::malloc>(ct_multiply::value,q_); + } + + ~data(){ + if(not values_){ + return; + } + + acpp::sycl::free(values_,q_); + } + + static constexpr data> get_dims() { + return {std::array{Dims...}}; + } + + data& at(data>& index){ + return values_[kel::lbm::flatten_index::apply(index,get_dims()).get()]; + } + + constexpr data* flat_data() { + return values_; + } +}; + +template +class data,kel::lbm::encode::Sycl> final { +public: + using Schema = kel::lbm::sch::Chunk; +private: + using InnerSchema = typename Schema::InnerSchema; + using ValueSchema = typename InnerSchema::ValueType; + + data> values_; +public: + data(acpp::sycl::queue& q__): + values_{q__} + {} + + data>& ghost_at(const data>& index){ + return values_.at(index); + } + + const data>& ghost_at(const data>& index) const { + return values_.at(index); + } + + static constexpr auto get_ghost_dims() { + return data>::get_dims(); + } + + data>& at(const data>& index){ + std::decay_t ind; + for(uint64_t i = 0u; i < sizeof...(Sides); ++i){ + ind.at({i}) = index.at({i}) + Ghost; + } + return values_.at(ind); + } + + const data>& at(const data>& index) const { + std::decay_t ind; + for(uint64_t i = 0u; i < sizeof...(Sides); ++i){ + ind.at({i}) = index.at({i}) + Ghost; + } + return values_.at(ind); + } + + static constexpr auto get_dims(){ + return data,kel::lbm::encode::Sycl>{{Sides...}}; + } + + auto flat_data(){ + return values_.flat_data(); + } + + static constexpr auto flat_size() { + return data>::flat_size(); + } +}; + template class data, Keys>...>, kel::lbm::encode::Sycl > final { public: static constexpr data> meta = {{Meta...}}; - using StorageT = std::tuple*...>; + using StorageT = std::tuple,kel::lbm::encode::Sycl>...>; + using Schema = schema::Struct, Keys>...>; private: /** @@ -31,43 +127,18 @@ private: * Do it here by specializing. */ StorageT members_; - kel::lbm::sycl::queue* q_; public: - data(): - members_{}, - q_{nullptr} - {} - - data(StorageT members__, kel::lbm::sycl::queue& q__): - members_{members__}, - q_{&q__} + data(acpp::sycl::queue& q__): + members_{{data,kel::lbm::encode::Sycl>{q__}...}} {} - ~data(){ - SAW_ASSERT(q_){ - return; - } - std::visit([this](auto arg){ - if(not arg){ - return; - } - acpp::sycl::free(arg,*q_); - arg = nullptr; - },members_); - } - - template - auto* get_ptr(){ - return std::get::value>(members_); - } - template auto& get(){ - auto ptr = get_ptr(); - SAW_ASSERT(ptr); - return *ptr; + return std::get::value>(members_); } }; + + } namespace kel { @@ -81,7 +152,7 @@ struct sycl_malloc_struct_helper, Encode> final { using Schema = sch::Struct; template - static saw::error_or allocate_on_device_member(typename saw::data::type::ValueType,encode::Sycl>::StorageT& storage, sycl::queue& q){ + static saw::error_or allocate_on_device_member(typename saw::data>::StorageT& storage, sycl::queue& q){ if constexpr (i < sizeof...(Members)){ using M = typename saw::parameter_pack_type::type; auto& ptr = std::get(storage); @@ -103,6 +174,60 @@ struct sycl_malloc_struct_helper, Encode> final { return eov; } }; + +template +struct sycl_copy_helper; + +template +struct sycl_copy_helper, Encode> final { + using Schema = sch::Struct; + + template + static saw::error_or copy_to_device_member(saw::data& host_data, saw::data>& sycl_data, sycl::queue& q){ + if constexpr (i < sizeof...(Members)){ + using M = typename saw::parameter_pack_type::type; + auto& host_member_data = host_data.template get(); + auto& sycl_member_data = sycl_data.template get(); + + auto host_ptr = host_member_data.flat_data(); + auto sycl_ptr = sycl_member_data.flat_data(); + + q.memcpy(host_ptr, sycl_ptr, sizeof(std::decay_t) * host_member_data.flat_size() ); + + return copy_to_device_member(host_data,sycl_data,q); + } + + return saw::make_void(); + } + + static saw::error_or copy_to_device(saw::data& host_data, saw::data>& sycl_data, sycl::queue& q){ + + return copy_to_device_member<0u>(host_data, sycl_data, q); + } + + template + static saw::error_or copy_to_host_member(saw::data>& sycl_data, saw::data& host_data, sycl::queue& q){ + if constexpr (i < sizeof...(Members)){ + using M = typename saw::parameter_pack_type::type; + auto& host_member_data = host_data.template get(); + auto& sycl_member_data = sycl_data.template get(); + + auto host_ptr = host_member_data.flat_data(); + auto sycl_ptr = sycl_member_data.flat_data(); + + q.memcpy(sycl_ptr, host_ptr, sizeof(std::decay_t) * host_member_data.flat_size() ); + + return copy_to_host_member(sycl_data,host_data,q); + } + + return saw::make_void(); + } + + + static saw::error_or copy_to_host(saw::data& sycl_data, saw::data>& host_data, sycl::queue& q){ + return copy_to_host_member<0u>(sycl_data, host_data, q); + } +}; } class device final { private: @@ -120,7 +245,21 @@ public: if(eov.is_error()){ return eov; } - sycl_data.set_queue(q_); + return saw::make_void(); + } + + template + saw::error_or copy_to_device(saw::data& host_data, saw::data>& sycl_data){ + return impl::sycl_copy_helper::copy_to_device(host_data, sycl_data, q_); + } + + template + saw::error_or copy_to_host(saw::data>& sycl_data, saw::data& host_data){ + return impl::sycl_copy_helper::copy_to_host(sycl_data, host_data, q_); + } + + auto& get_handle(){ + return q_; } }; } diff --git a/lib/sycl/tests/data.cpp b/lib/sycl/tests/data.cpp index e57a1e3..3073a22 100644 --- a/lib/sycl/tests/data.cpp +++ b/lib/sycl/tests/data.cpp @@ -1,6 +1,21 @@ #include +#include "../c++/lbm.hpp" -SAW_TEST("Sycl Dummy"){ +SAW_TEST("Sycl Data Compilation"){ + acpp::sycl::queue q; + saw::data< + saw::schema::Struct< + saw::schema::Member< + kel::lbm::sch::Chunk, + "test" + > + >, + kel::lbm::encode::Sycl + > dat{q}; + auto& test_f = dat.template get<"test">(); + + // test_f.at({}).set(1); + // SAW_EXPECT(test_f.at({}).get() == 1, "Value check failed"); } -- cgit v1.2.3