From 729307460e77f62a532ee9841dcaed9c47f46419 Mon Sep 17 00:00:00 2001 From: "Claudius \"keldu\" Holeksa" Date: Wed, 26 Jun 2024 09:39:34 +0200 Subject: Added better structure for the data server --- modules/remote-sycl/c++/transfer.hpp | 118 ++++++++++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 16 deletions(-) (limited to 'modules/remote-sycl/c++/transfer.hpp') diff --git a/modules/remote-sycl/c++/transfer.hpp b/modules/remote-sycl/c++/transfer.hpp index 6849caa..65a9b9e 100644 --- a/modules/remote-sycl/c++/transfer.hpp +++ b/modules/remote-sycl/c++/transfer.hpp @@ -2,11 +2,26 @@ #include "common.hpp" #include "data.hpp" +#include "device.hpp" + #include +#include namespace saw { -template -class data_server { +namespace impl { +template +struct data_server_redux { + using type = std::tuple<>; +}; + +template +struct data_server_redux> { + using type = std::tuple>...>; +}; +} + +template +class data_server, Encoding, rmt::Sycl> { private: /** * Device context class @@ -16,7 +31,7 @@ private: /** * Store for the data the server manages. */ - std::unordered_map> values_; + impl::data_server_redux>::type >::type values_; public: /** * Main constructor @@ -26,29 +41,83 @@ public: {} /** - * Receive data which we will store. + * Get data which we will store. */ - error_or send(const data& dat, id store_id){ - auto eoval = device_->copy_to_device(dat); + template + error_or send(const data& dat, id store_id){ + auto& vals = std::get(values_); + auto eoval = device_->template copy_to_device(dat); if(eoval.is_error()){ auto& err = eoval.get_error(); return std::move(err); } - return make_error(); + auto& val = eoval.get_value(); + try { + auto insert_res = vals.insert(std::make_pair(store_id.get_value(), std::move(val))); + if(!insert_res.second){ + return make_error(); + } + }catch ( std::exception& ){ + return make_error(); + } + return void_t{}; + } + + /** + * Requests data from the server + */ + template + error_or> receive(id store_id){ + auto& vals = std::get(values_); + auto find_res = vals.find(store_id.get_value()); + if(find_res == vals.end()){ + return make_error(); + } + auto& dat = find_res->second; + + auto eoval = device_->copy_to_host(dat); + return eoval; + } + + /** + * Request an erase of the stored data + */ + template + error_or erase(id store_id){ + auto& vals = std::get(values_); + auto erase_op = vals.erase(store_id.get_value()); + if(erase_op == 0u){ + return make_error(); + } + return void_t{}; } - error_or> receive(id store_id){ - return make_error(); + /** + * Get the stored data on the server side for immediate use. + * Insert operations may invalidate the pointer. + */ + template + error_or*> find(id store_id){ + auto& vals = std::get(values_); + auto find_res = vals.find(store_id.get_value()); + if(find_res == vals.end()){ + return make_error(); + } + + return &(find_res.second); } }; -template -class data_client { +/** + * Client for transporting data to remote and receiving data back + */ +template +class data_client, Encoding, rmt::Sycl> { private: /** * Corresponding server for this client */ - data_server* srv_; + data_server, Encoding, rmt::Sycl>* srv_; /** * The next id for identifying issues on the remote side. @@ -58,16 +127,17 @@ public: /** * Main constructor */ - data_client(data_server& srv__): + data_client(data_server, Encoding, rmt::Sycl>& srv__): srv_{&srv__}, next_id_{0u} {} /** - * Send data to. + * Send data to the remote. */ - error_or> send(const data& dat){ - id dat_id{next_id_}; + template + error_or> send(const data& dat){ + id dat_id{next_id_}; auto eov = srv_->send(dat, dat_id); if(eov.is_error()){ auto& err = eov.get_error(); @@ -77,5 +147,21 @@ public: ++next_id_; return dat_id; } + + /** + * Receive data + */ + template + conveyor> receive(id dat_id){ + return srv_->receive(dat_id); + } + + /** + * Erase data + */ + template + error_or erase(id dat_id){ + return srv_->erase(dat_id); + } }; } -- cgit v1.2.3