diff options
author | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-06-11 16:05:47 +0200 |
---|---|---|
committer | Claudius "keldu" Holeksa <mail@keldu.de> | 2024-06-11 16:05:47 +0200 |
commit | 6831edddd22d2d8dbb73c88fb612c0bdd5b8ba19 (patch) | |
tree | d9837a9720acd66852fb374d51079f02bf33c0b0 /modules/remote-sycl | |
parent | 1ad8bc8e0b6d87d49d63105b3eac3cc8d5a06e56 (diff) |
Intermediate commit while working on design issues
Diffstat (limited to 'modules/remote-sycl')
-rw-r--r-- | modules/remote-sycl/SConstruct | 2 | ||||
-rw-r--r-- | modules/remote-sycl/c++/remote.hpp | 100 | ||||
-rw-r--r-- | modules/remote-sycl/examples/SConscript | 2 | ||||
-rw-r--r-- | modules/remote-sycl/examples/sycl_basic.cpp | 2 | ||||
-rw-r--r-- | modules/remote-sycl/examples/sycl_basic.hpp | 4 | ||||
-rw-r--r-- | modules/remote-sycl/examples/sycl_basic_kernel.cpp | 10 |
6 files changed, 108 insertions, 12 deletions
diff --git a/modules/remote-sycl/SConstruct b/modules/remote-sycl/SConstruct index 78c27ab..96e9df9 100644 --- a/modules/remote-sycl/SConstruct +++ b/modules/remote-sycl/SConstruct @@ -58,7 +58,7 @@ env=Environment(ENV=os.environ, variables=env_vars, CPPPATH=[], ,'forstio-async' ,'forstio-io' ,'forstio-io_codec' - ,'hipSYCL-rt' + ,'acpp-rt' ,'OpenCL' ,'omp' ] diff --git a/modules/remote-sycl/c++/remote.hpp b/modules/remote-sycl/c++/remote.hpp index dbbefcb..d311ca5 100644 --- a/modules/remote-sycl/c++/remote.hpp +++ b/modules/remote-sycl/c++/remote.hpp @@ -4,7 +4,7 @@ #include <forstio/codec/data.hpp> #include <forstio/codec/id_map.hpp> -#include <CL/sycl.hpp> +#include <AdaptiveCpp/CL/sycl.hpp> namespace saw { namespace rmt { @@ -37,13 +37,77 @@ public: conveyor<data<T,Encoding>> on_receive(); /// Stopped here }; +/** + * + */ +template<typename T, uint64_t N> +class data<schema::Primitive<T,N>, encode::Native<rmt::Sycl>> { +public: + using Schema = schema::Primitive<T,N>; + using NativeType = typename native_data_type<Schema>::type; +private: + /** + * + */ + NativeType val_; +public: + /** + * + */ + data(NativeType val__): + val_{val__} + {} + + NativeType get(){ + return val_; + } +}; + template<typename T, uint64_t D> class data<schema::Array<T,D>, encode::Native<rmt::Sycl>> { +public: + using Schema = schema::Array<T,D>; private: - cl::sycl::buffer<typename native_data_type<T>::type, D> device_data_; + uint64_t total_length_; + typename native_data_type<T>::type* device_data_; + // data<T>* device_data_; + cl::sycl::queue* queue_; + static_assert(is_primitive<T>::value, "Only supports primitives for now"); static_assert(D==1u, "For now we only support 1D Arrays"); public: + data(uint64_t size, cl::sycl::queue& q__): + total_length_{size}, + device_data_{cl::sycl::malloc_device<typename native_data_type<T>::type>(size, q__)}, + queue_{&q__} + { + if(!device_data_){ + total_length_ = 0u; + } + } + + template<typename Encoding> + data(const data<Schema, Encoding>& from, cl::sycl::queue& q__): + total_length_{from.size()}, + device_data_{cl::sycl::malloc_device<typename native_data_type<T>::type>(from.size(), q__)}, + queue_{&q__} + { + if(!device_data_){ + total_length_ = 0u; + } + } + + ~data(){ + // free data + if(device_data_){ + /// SYCL FREE + cl::sycl::free(device_data_, *queue_); + } + } + + data<T,encode::Native<rmt::Sycl>>& at(uint64_t i){ + return device_data_[i]; + } }; namespace impl { @@ -59,6 +123,36 @@ struct rpc_id_map_helper<schema::Interface<Members...>, Encoding> { }; } /** + * Rpc Client class for the Sycl backend. + */ +template<typename Iface, typename Encoding> +class rpc_client<Iface, Encoding, rmt::Sycl> { +public: +private: + /** + * Server this client is tied to + */ + rpc_server<Iface, Encoding, rmt::Sycl>* srv_; +public: + rpc_client(rpc_server<Iface, Encoding, rmt::Sycl>& srv): + srv_{&srv} + {} + + /** + * Rpc call + */ + template<string_literal Name, typename ClientEncoding> + error_or< + id< + typename schema_member_type<Name, Iface>::type::ResponseT + > + > call(data_or_id<typename schema_member_type<Name, Iface>::type::RequestT, ClientEncoding> input){ + return make_error<err::not_implemented>("RpcClient side is not implemented"); + } + +}; + +/** * Rpc Server class for the Sycl backend. */ template<typename Iface, typename Encoding> @@ -103,6 +197,8 @@ public: > > call(data_or_id<typename schema_member_type<Name, Iface>::type::RequestT, Encoding> input){ + + /** * First check if it's data or an id. * If it's an id, check if it's registered within the storage and retrieve it. diff --git a/modules/remote-sycl/examples/SConscript b/modules/remote-sycl/examples/SConscript index 3c510eb..02e528b 100644 --- a/modules/remote-sycl/examples/SConscript +++ b/modules/remote-sycl/examples/SConscript @@ -14,7 +14,7 @@ examples_env = env.Clone(); examples_sycl_env = examples_env.Clone(); -examples_sycl_env['CXX'] = 'syclcc'; +examples_sycl_env['CXX'] = 'acpp'; examples_env.sources = sorted(glob.glob(dir_path + "/*.cpp")) examples_env.headers = sorted(glob.glob(dir_path + "/*.hpp")) diff --git a/modules/remote-sycl/examples/sycl_basic.cpp b/modules/remote-sycl/examples/sycl_basic.cpp index 64ec1fe..3f92cdb 100644 --- a/modules/remote-sycl/examples/sycl_basic.cpp +++ b/modules/remote-sycl/examples/sycl_basic.cpp @@ -23,7 +23,7 @@ int main(){ saw::id<schema::UInt64> next_id{0u}; { - auto eov = rpc_server.template call<"increment">(saw::data<schema::UInt64>{1u}); + auto eov = rpc_server.template call<"increment">(saw::data<schema::UInt64, saw::encode::Native<saw::rmt::Sycl>>{1u}); if(eov.is_error()){ auto& err = eov.get_error(); std::cerr<<"Error: "<<err.get_category()<<" : "<<err.get_message()<<std::endl; diff --git a/modules/remote-sycl/examples/sycl_basic.hpp b/modules/remote-sycl/examples/sycl_basic.hpp index 0d4b5d2..c7cfadc 100644 --- a/modules/remote-sycl/examples/sycl_basic.hpp +++ b/modules/remote-sycl/examples/sycl_basic.hpp @@ -6,8 +6,8 @@ namespace schema { using namespace saw::schema; using BasicInterface = Interface< - Member<Function<UInt64, UInt64>, "increment"> + Member<Function<Array<UInt64>, UInt64>, "increment"> >; } -saw::rpc_server<schema::BasicInterface, saw::encode::Native<saw::storage::Default>, saw::rmt::Sycl> listen_basic_sycl(saw::remote<saw::rmt::Sycl>& ctx, saw::remote_address<saw::rmt::Sycl>& addr); +saw::rpc_server<schema::BasicInterface, saw::encode::Native<saw::rmt::Sycl>, saw::rmt::Sycl> listen_basic_sycl(saw::remote<saw::rmt::Sycl>& ctx, saw::remote_address<saw::rmt::Sycl>& addr); diff --git a/modules/remote-sycl/examples/sycl_basic_kernel.cpp b/modules/remote-sycl/examples/sycl_basic_kernel.cpp index 18fe9b7..86e73b5 100644 --- a/modules/remote-sycl/examples/sycl_basic_kernel.cpp +++ b/modules/remote-sycl/examples/sycl_basic_kernel.cpp @@ -1,9 +1,9 @@ #include "sycl_basic.hpp" -saw::rpc_server<schema::BasicInterface, saw::encode::Native<saw::storage::Default>, saw::rmt::Sycl> listen_basic_sycl(saw::remote<saw::rmt::Sycl>& ctx, saw::remote_address<saw::rmt::Sycl>& addr){ - saw::interface<schema::BasicInterface, saw::encode::Native<saw::storage::Default>, cl::sycl::queue*> iface{ - [](saw::data<saw::schema::UInt64> in, cl::sycl::queue* q) -> saw::data<saw::schema::UInt64> { - uint64_t inr = in.get(); +saw::rpc_server<schema::BasicInterface, saw::encode::Native<saw::rmt::Sycl>, saw::rmt::Sycl> listen_basic_sycl(saw::remote<saw::rmt::Sycl>& ctx, saw::remote_address<saw::rmt::Sycl>& addr){ + saw::interface<schema::BasicInterface, saw::encode::Native<saw::rmt::Sycl>, cl::sycl::queue*> iface{ + [](saw::data<saw::schema::Array<saw::schema::UInt64>, saw::encode::Native<saw::rmt::Sycl>> in, cl::sycl::queue* q) -> saw::data<saw::schema::UInt64, saw::encode::Native<saw::rmt::Sycl>> { + uint64_t inr = in.size(); cl::sycl::buffer<uint64_t,1> d_inc{ &inr, 1u }; q->submit([&](cl::sycl::handler& h){ auto a_inc = d_inc.get_access<cl::sycl::access::mode::read_write>(h); @@ -16,7 +16,7 @@ saw::rpc_server<schema::BasicInterface, saw::encode::Native<saw::storage::Defaul return {inr}; } }; - auto rpc_server = ctx.template listen<schema::BasicInterface, saw::encode::Native<saw::storage::Default>>(addr, std::move(iface)); + auto rpc_server = ctx.template listen<schema::BasicInterface, saw::encode::Native<saw::rmt::Sycl>>(addr, std::move(iface)); return rpc_server; } |