diff options
-rw-r--r-- | modules/codec/c++/transport.hpp | 18 | ||||
-rw-r--r-- | modules/io_codec/c++/io_peer.hpp | 22 | ||||
-rw-r--r-- | modules/io_codec/c++/io_peer.tmpl.hpp | 36 | ||||
-rw-r--r-- | modules/io_codec/examples/peer_echo_client.cpp | 4 | ||||
-rw-r--r-- | modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp | 1 | ||||
-rw-r--r-- | modules/tools/c++/c_gen_iface.hpp | 146 | ||||
-rw-r--r-- | modules/tools/tests/c_iface.cpp | 3 |
7 files changed, 181 insertions, 49 deletions
diff --git a/modules/codec/c++/transport.hpp b/modules/codec/c++/transport.hpp index db277d1..430f719 100644 --- a/modules/codec/c++/transport.hpp +++ b/modules/codec/c++/transport.hpp @@ -1,5 +1,8 @@ #pragma once +#include <forstio/buffer.hpp> +#include "data.hpp" + namespace saw { namespace transport { template<uint64_t Len = 8u> @@ -12,23 +15,16 @@ struct NewLine {}; struct CarriageReturnNewLine {}; } -template<typename Transport> -struct transport { -private: - static_assert(always_false<Transport>, "Transport kind not supported."); -public: - - -template<uint64_t Len> -struct transport<transport::FixedLength<Len>> { +template<typename Schema, uint64_t Len> +struct codec<Schema, transport::FixedLength<Len>> { private: public: - error_or<buffer_view> view_slice(const buffer& buff) const { + error_or<buffer_view> view_slice(buffer& buff) const { (void) buff; return make_error<err::not_implemented>(); } - error_or<array_buffer> chain_slice(buffer& buff) const { + error_or<array_buffer> chain_slice(chain_array_buffer& buff) const { (void) buff; return make_error<err::not_implemented>(); } diff --git a/modules/io_codec/c++/io_peer.hpp b/modules/io_codec/c++/io_peer.hpp index f576cbe..613f60e 100644 --- a/modules/io_codec/c++/io_peer.hpp +++ b/modules/io_codec/c++/io_peer.hpp @@ -11,19 +11,21 @@ template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding, typename BufferT = ring_buffer> class streaming_io_peer { +private: + static_assert(not std::is_same_v<ContentEncoding, encode::Native>, "The native encoding by definition is not fit for transport."); public: /** * Constructor with the option to provide a custom codec, in and out buffer */ streaming_io_peer( - own<conveyor_feeder<data<Incoming, Encoding>>> feed, - own<async_io_stream> stream, codec<Incoming, Encoding> in_codec, codec<Outgoing, Encoding> out_codec, BufferT in, BufferT out); + own<conveyor_feeder<data<Incoming, ContentEncoding>>> feed, + own<async_io_stream> stream, codec<Incoming, TransportEncoding> in_codec, codec<Outgoing, TransportEncoding> out_codec, BufferT in, BufferT out); /** * Constructor with mostly default assignements */ streaming_io_peer( - own<conveyor_feeder<data<Incoming, Encoding>>> feed, + own<conveyor_feeder<data<Incoming, ContentEncoding>>> feed, own<async_io_stream> stream); /** @@ -35,25 +37,25 @@ public: /** * Send a message to the remote peer */ - error_or<void> send(data<Outgoing> builder); + error_or<void> send(data<Outgoing, ContentEncoding> builder); /** * A phantom conveyor feeder. Meant for interfacing with other components */ - conveyor_feeder<data<Outgoing, Encoding>> &feeder(); + conveyor_feeder<data<Outgoing, ContentEncoding>> &feeder(); conveyor<void> on_read_disconnected(); private: /// @unimplemented class peer_conveyor_feeder final - : public conveyor_feeder<data<Outgoing, Encoding>> { + : public conveyor_feeder<data<Outgoing, ContentEncoding>> { public: peer_conveyor_feeder( streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT> &peer_) : peer_{peer_} {} - void feed(data<Outgoing, Encoding> &&data_) override { + void feed(data<Outgoing, ContentEncoding> &&data_) override { (void)data_; } @@ -63,14 +65,14 @@ private: size_t queued() const override { return 0; } - error_or<void> swap(conveyor<data<Outgoing, Encoding>> &&conveyor) noexcept override { return make_error<err::not_implemented>();} + error_or<void> swap(conveyor<data<Outgoing, ContentEncoding>> &&) noexcept override { return make_error<err::not_implemented>();} private: streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT> &peer_; }; private: - own<conveyor_feeder<data<Incoming, Encoding>>> + own<conveyor_feeder<data<Incoming, ContentEncoding>>> incoming_feeder_ = nullptr; own<async_io_stream> io_stream_; @@ -95,7 +97,7 @@ template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding, typename BufferT = ring_buffer> std::pair<own<streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT>>, - conveyor<data<Incoming, Encoding>>> + conveyor<data<Incoming, ContentEncoding>>> new_streaming_io_peer(own<async_io_stream> stream); } // namespace saw diff --git a/modules/io_codec/c++/io_peer.tmpl.hpp b/modules/io_codec/c++/io_peer.tmpl.hpp index d9dfe04..b7ccb49 100644 --- a/modules/io_codec/c++/io_peer.tmpl.hpp +++ b/modules/io_codec/c++/io_peer.tmpl.hpp @@ -1,20 +1,20 @@ namespace saw { -template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding +template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding, typename BufferT> streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT>:: streaming_io_peer( - own<conveyor_feeder<data<Incoming, Encoding>>> feed, + own<conveyor_feeder<data<Incoming, ContentEncoding>>> feed, own<async_io_stream> str) : streaming_io_peer{std::move(feed), std::move(str), {}, {}, {}, {}} {} -template <typename Incoming, typename Outgoing, typename TransportEncoding, ContentEncoding, typename BufferT> +template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding, typename BufferT> streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT>:: streaming_io_peer( - own<conveyor_feeder<data<Incoming, Encoding>>> feed, - own<async_io_stream> stream, codec<Incoming, Encoding> in_codec, codec<Outgoing, Encoding> out_codec, BufferT in, BufferT out) + own<conveyor_feeder<data<Incoming, ContentEncoding>>> feed, + own<async_io_stream> stream, codec<Incoming, TransportEncoding> in_codec, codec<Outgoing, TransportEncoding> out_codec, BufferT in, BufferT out) : incoming_feeder_{std::move(feed)}, io_stream_{std::move(stream)}, in_codec_{std::move(in_codec)}, @@ -34,7 +34,7 @@ streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, while (true) { buffer_view in_view{in_buffer_}; - auto in_data = data<Incoming, Encoding>{in_view}; + auto in_data = data<Incoming, TransportEncoding>{in_view}; incoming_feeder_->feed(std::move(in_data)); } @@ -61,14 +61,14 @@ streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, io_stream_->read(&in_buffer_.write(), 1, in_buffer_.write_segment_length()); } -template <typename Incoming, typename Outgoing, - typename Encoding, typename BufferT> -error_or<void> streaming_io_peer<Incoming, Outgoing, Encoding, - BufferT>::send(data<Outgoing> +template <typename Incoming, typename Outgoing, typename TransportEncoding, + typename ContentEncoding, typename BufferT> +error_or<void> streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, + BufferT>::send(data<Outgoing, ContentEncoding> msg) { bool restart_write = out_buffer_.read_segment_length() == 0; - data<Outgoing, Encoding> enc; + data<Outgoing, TransportEncoding> enc; auto eov = out_codec_.encode(msg, enc);//msg.read(), out_buffer_); @@ -84,22 +84,22 @@ error_or<void> streaming_io_peer<Incoming, Outgoing, Encoding, return void_t{}; } -template <typename Incoming, typename Outgoing, typename Encoding, +template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding, typename BufferT> conveyor<void> -streaming_io_peer<Incoming, Outgoing, Encoding, +streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT>::on_read_disconnected() { return io_stream_->on_read_disconnected(); } -template <typename Incoming, typename Outgoing, typename Encoding, typename BufferT> -std::pair<own<streaming_io_peer<Incoming, Outgoing, Encoding, BufferT>>, - conveyor<data<Incoming,Encoding>>> +template <typename Incoming, typename Outgoing, typename TransportEncoding, typename ContentEncoding, typename BufferT> +std::pair<own<streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding, BufferT>>, + conveyor<data<Incoming,ContentEncoding>>> new_streaming_io_peer(own<async_io_stream> stream) { auto caf = - new_conveyor_and_feeder<data<Incoming, Encoding>>(); + new_conveyor_and_feeder<data<Incoming, ContentEncoding>>(); - return {heap<streaming_io_peer<Incoming, Outgoing, Encoding,BufferT>>( + return {heap<streaming_io_peer<Incoming, Outgoing, TransportEncoding, ContentEncoding,BufferT>>( std::move(caf.feeder), std::move(stream)), std::move(caf.conveyor)}; } diff --git a/modules/io_codec/examples/peer_echo_client.cpp b/modules/io_codec/examples/peer_echo_client.cpp index f1836e4..b09a51a 100644 --- a/modules/io_codec/examples/peer_echo_client.cpp +++ b/modules/io_codec/examples/peer_echo_client.cpp @@ -4,6 +4,8 @@ #include <iostream> +#include <forstio/codec/transport.hpp> + int main(){ using namespace saw; @@ -34,7 +36,7 @@ int main(){ network.connect(*addr).then([](saw::own<saw::io_stream> client){ auto echo_stream = saw::heap<saw::async_io_stream>(std::move(client)); - auto echo_peer_stream_p = saw::new_streaming_io_peer<sch::Echo, sch::Echo, encode::KelSimple, ring_buffer>(std::move(echo_stream)); + auto echo_peer_stream_p = saw::new_streaming_io_peer<sch::Echo, sch::Echo, transport::FixedLength<8u>, encode::KelSimple, ring_buffer>(std::move(echo_stream)); echo_peer_stream_p.first->on_read_disconnected().attach(std::move(echo_peer_stream_p.first)).detach(); }).detach(); diff --git a/modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp b/modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp index 591ded2..e99de53 100644 --- a/modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp +++ b/modules/remote-sycl/benchmarks/kernel_mixed_precision.cpp @@ -12,6 +12,7 @@ saw::interface<sch::MixedPrecisionBenchmarkInterface, saw::encode::Native, saw:: auto acc_buff = in.template access<cl::sycl::access::mode::read_write>(h); h.parallel_for(cl::sycl::range<1>(in_size), [=] (cl::sycl::id<1> it){ + saw::data<sch::Float64> foo = {acc_buff[0u].at(it[0u]).get()}; for(uint64_t i = 0; i < arithmetic_intensity; ++i){ if( foo.get() == 1.1e12 ){ diff --git a/modules/tools/c++/c_gen_iface.hpp b/modules/tools/c++/c_gen_iface.hpp index 3a648a1..4fa881c 100644 --- a/modules/tools/c++/c_gen_iface.hpp +++ b/modules/tools/c++/c_gen_iface.hpp @@ -159,8 +159,10 @@ struct lang_bind_helper { } template<typename Schema> - static error_or<void> append_translation_func(std::string& buff, const std::string_view& prefix, bool c_to_cpp){ + static error_or<void> append_translation_func(std::string& buff, const std::string_view& prefix, bool c_to_cpp, bool with_return_type = true){ constexpr uint32_t hash = schema_hash<Schema>::apply(); + + if(with_return_type) { auto eov = lang_bind_helper::append_string(buff, "saw::error_or<void> "); if(eov.is_error()){ @@ -488,29 +490,127 @@ struct lang_bind<schema::Struct<schema::Member<V,K>...>, binding::SyncC> { using Schema = schema::Struct<schema::Member<V,K>...>; template<uint64_t i> - static error_or<void> generate_translation_func(const language_binding_config& cfg, language_binding_state& state, std::string& buff, bool c_to_cpp){ + static error_or<void> generate_translation_func(const language_binding_config& cfg, language_binding_state& state, bool c_to_cpp, uint64_t id){ using MT = typename parameter_pack_type<i,V...>::type; static constexpr string_literal Lit = parameter_key_pack_type<i,K...>::literal; constexpr uint32_t hash = schema_hash<MT>::apply(); auto& tpe = state.tp_elements; - uint64_t id; + if constexpr (i == 0){ + auto eov = lang_bind_helper::append_translation_func<Schema>(tpe.at(id).source, cfg.prefix, c_to_cpp); + if(eov.is_error()){ + return eov; + } + } + if constexpr (i == 0) { - std::string hash_type_str = cfg.prefix + "_" + std::to_string(hash) + "_t"; + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "{\n\t"); + if(eov.is_error()){ + return eov; + } } { - auto eov = lang_bind_helper::append_string(tpe.at(id).source, "\treturn void_t{};\n}\n"); + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "{\n\t\tauto eov = "); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = lang_bind_helper::append_hashed_type(tpe.at(id).source, cfg.prefix, hash); + if(eov.is_error()){ + return eov; + } + } + { + std::string_view trans = c_to_cpp ? "_translate_c_to_cpp (" : "_translate_cpp_to_c ("; + auto eov = lang_bind_helper::append_string(tpe.at(id).source, trans); + if(eov.is_error()){ + return eov; + } + } + if(c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "&((*c_val)."); + if(eov.is_error()){ + return eov; + } + } + if(c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, std::string{Lit.view()}); + if(eov.is_error()){ + return eov; + } + } + if(c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "), cpp_val.template get<\""); + if(eov.is_error()){ + return eov; + } + } + if(c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, std::string{Lit.view()}); + if(eov.is_error()){ + return eov; + } + } + if(c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "\">()"); + if(eov.is_error()){ + return eov; + } + } + if(!c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, " cpp_val.template get<\""); + if(eov.is_error()){ + return eov; + } + } + if(!c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, std::string{Lit.view()}); + if(eov.is_error()){ + return eov; + } + } + if(!c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "\">(), &((*c_val)."); + if(eov.is_error()){ + return eov; + } + } + if(!c_to_cpp){ + auto eov = lang_bind_helper::append_string(tpe.at(id).source, std::string{Lit.view()}); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = lang_bind_helper::append_string(tpe.at(id).source, ") );\n\t\t");//cpp_output.set(*c_input);\n"); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "if(eov.is_error()) return eov.get_error();\n\t}\n\t");//cpp_output.set(*c_input);\n"); if(eov.is_error()){ return eov; } } + if constexpr ( (i+1) < sizeof...(V) ){ + return generate_translation_func<i+1u>(cfg, state, c_to_cpp, id); + } + + { + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "return void_t{};\n}\n"); + if(eov.is_error()){ + return eov; + } + } return void_t{}; } template<uint64_t i> - static error_or<void> generate_ele(const language_binding_config& cfg, language_binding_state& state, int64_t id){ + static error_or<void> generate_ele(const language_binding_config& cfg, language_binding_state& state, uint64_t id){ using MT = typename parameter_pack_type<i,V...>::type; static constexpr string_literal Lit = parameter_key_pack_type<i,K...>::literal; @@ -621,14 +721,16 @@ struct lang_bind<schema::Struct<schema::Member<V,K>...>, binding::SyncC> { return eov; } } + if constexpr ( sizeof...(V) > 0 ) { - auto eov = generate_translation_func<0>(tpe.at(id).source, cfg.prefix, true); + auto eov = generate_translation_func<0>(cfg, state, true, id); if(eov.is_error()){ return eov; } } + if constexpr ( sizeof...(V) > 0 ) { - auto eov = generate_translation_func<0>(tpe.at(id).source, cfg.prefix, false); + auto eov = generate_translation_func<0>(cfg, state, false, id); if(eov.is_error()){ return eov; } @@ -741,6 +843,34 @@ struct lang_bind<schema::Array<T,D>, binding::SyncC> { return eov; } } + /** + * Source + */ + { + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "namespace {\n"); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = lang_bind_helper::append_translation_func<Schema>(tpe.at(id).source, cfg.prefix, true); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = lang_bind_helper::append_translation_func<Schema>(tpe.at(id).source, cfg.prefix, false); + if(eov.is_error()){ + return eov; + } + } + { + auto eov = lang_bind_helper::append_string(tpe.at(id).source, "\n}\n"); + if(eov.is_error()){ + return eov; + } + } + } return void_t{}; diff --git a/modules/tools/tests/c_iface.cpp b/modules/tools/tests/c_iface.cpp index 35591f8..25a5d04 100644 --- a/modules/tools/tests/c_iface.cpp +++ b/modules/tools/tests/c_iface.cpp @@ -19,7 +19,8 @@ using TestArray = Array< >; using TestStructArray = Struct< - Member<TestArray, "array"> + Member<TestArray, "array">, + Member<UInt64, "un_int_num"> >; using TestStructMore = Struct< |