From 4049e78c32adf23e685ba6dfc72466425e34bec9 Mon Sep 17 00:00:00 2001 From: mutouyun Date: Wed, 20 Mar 2019 18:26:41 +0800 Subject: [PATCH] fix bugs; optimize (TBD); update performance.xlsx --- performance.xlsx | Bin 31288 -> 33022 bytes src/ipc.cpp | 4 +- src/prod_cons.h | 106 ++++++++++++++++++++++++++++++++------------- src/queue.h | 38 ++++++++-------- test/test_circ.cpp | 15 +++++-- test/test_ipc.cpp | 8 ++-- 6 files changed, 114 insertions(+), 57 deletions(-) diff --git a/performance.xlsx b/performance.xlsx index f5564d22c132d094223e97634e63b083d9017630..82f29d530c96af12f6eb32f27ea6fd0b3276e0c5 100644 GIT binary patch delta 14350 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 delta 12544 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 diff --git a/src/ipc.cpp b/src/ipc.cpp index c23dbcd..79d20d7 100644 --- a/src/ipc.cpp +++ b/src/ipc.cpp @@ -146,7 +146,7 @@ static bool send(ipc::handle_t h, void const * data, std::size_t size) { { que, msg_id, static_cast(size) - offset - static_cast(data_length) }, {} }; std::memcpy(msg.data_, static_cast(data) + offset, data_length); - if (!que->push(msg)) return false; + while (!que->push(msg)) std::this_thread::yield(); } // if remain > 0, this is the last message fragment int remain = static_cast(size) - offset; @@ -156,7 +156,7 @@ static bool send(ipc::handle_t h, void const * data, std::size_t size) { }; std::memcpy(msg.data_, static_cast(data) + offset, static_cast(remain)); - if (!que->push(msg)) return false; + while (!que->push(msg)) std::this_thread::yield(); } return true; } diff --git a/src/prod_cons.h b/src/prod_cons.h index bdd8966..4acd4da 100644 --- a/src/prod_cons.h +++ b/src/prod_cons.h @@ -182,17 +182,12 @@ struct prod_cons_impl> { bool push(W* wrapper, F&& f, E* elems) { auto conn_cnt = wrapper->conn_count(std::memory_order_relaxed); if (conn_cnt == 0) return false; - auto el = elems + circ::index_of(wt_.load(std::memory_order_acquire)); + auto* el = elems + circ::index_of(wt_.load(std::memory_order_acquire)); // check all consumers have finished reading this element - while (1) { - rc_t expected = 0; - if (el->rc_.compare_exchange_weak( - expected, static_cast(conn_cnt), std::memory_order_release)) { - break; - } - std::this_thread::yield(); - conn_cnt = wrapper->conn_count(); // acquire - if (conn_cnt == 0) return false; + rc_t expected = 0; + if (!el->rc_.compare_exchange_strong( + expected, static_cast(conn_cnt), std::memory_order_release)) { + return false; // full } std::forward(f)(&(el->data_)); wt_.fetch_add(1, std::memory_order_release); @@ -202,7 +197,7 @@ struct prod_cons_impl> { template class E, std::size_t DataSize> bool pop(W* /*wrapper*/, circ::u2_t& cur, F&& f, E* elems) { if (cur == cursor()) return false; // acquire - auto el = elems + circ::index_of(cur++); + auto* el = elems + circ::index_of(cur++); std::forward(f)(&(el->data_)); for (unsigned k = 0;;) { rc_t cur_rc = el->rc_.load(std::memory_order_acquire); @@ -219,38 +214,89 @@ struct prod_cons_impl> { }; template <> -struct prod_cons_impl> - : prod_cons_impl> { +struct prod_cons_impl> { + + using rc_t = std::uint64_t; + using flag_t = std::uint64_t; + + enum : rc_t { + rc_mask = 0x00000000ffffffffull, + rc_incr = 0x0000000100000000ull + }; + + template + struct elem_t { + byte_t data_[DataSize] {}; + std::atomic rc_ { 0 }; // read-counter + std::atomic f_ct_ { 0 }; // commit flag + }; alignas(circ::cache_line_size) std::atomic ct_; // commit index + circ::u2_t cursor() const noexcept { + return ct_.load(std::memory_order_acquire); + } + template class E, std::size_t DataSize> bool push(W* wrapper, F&& f, E* elems) { - auto conn_cnt = wrapper->conn_count(std::memory_order_relaxed); - if (conn_cnt == 0) return false; - circ::u2_t cur_ct = ct_.fetch_add(1, std::memory_order_acquire), - nxt_ct = cur_ct + 1; - auto el = elems + circ::index_of(cur_ct); - // check all consumers have finished reading this element - while (1) { - rc_t expected = 0; + E* el; + circ::u2_t cur_ct, nxt_ct; + for (unsigned k = 0;;) { + auto cc = wrapper->conn_count(std::memory_order_relaxed); + if (cc == 0) { + return false; // no reader + } + el = elems + circ::index_of(cur_ct = ct_.load(std::memory_order_relaxed)); + auto cur_rc = el->rc_.load(std::memory_order_acquire); + if (cur_rc & rc_mask) { + return false; // full + } + auto cur_fl = el->f_ct_.load(std::memory_order_acquire); + if ((cur_fl != cur_ct) && cur_fl) { + return false; // full + } + // (cur_rc & rc_mask) should == 0 here if (el->rc_.compare_exchange_weak( - expected, static_cast(conn_cnt), std::memory_order_release)) { + cur_rc, static_cast(cc) | ((cur_rc & ~rc_mask) + rc_incr), std::memory_order_release)) { break; } - std::this_thread::yield(); - conn_cnt = wrapper->conn_count(); // acquire - if (conn_cnt == 0) return false; + ipc::yield(k); } + // only one thread/process would touch here at one time + ct_.store(nxt_ct = cur_ct + 1, std::memory_order_release); std::forward(f)(&(el->data_)); - while (1) { - auto exp_wt = cur_ct; - if (wt_.compare_exchange_weak(exp_wt, nxt_ct, std::memory_order_release)) { + // set flag & try update wt + el->f_ct_.store(~static_cast(cur_ct)); + return true; + } + + template class E, std::size_t DataSize, std::size_t N> + bool pop(W* /*wrapper*/, circ::u2_t& cur, F&& f, E(& elems)[N]) { + auto* el = elems + circ::index_of(cur); + auto cur_fl = el->f_ct_.load(std::memory_order_acquire); + if (cur_fl != ~static_cast(cur)) { + return false; // empty + } + ++cur; + std::forward(f)(&(el->data_)); + for (unsigned k = 0;;) { + auto cur_rc = el->rc_.load(std::memory_order_acquire); + switch (cur_rc & rc_mask) { + case 0: + el->f_ct_.store(cur + N - 1, std::memory_order_release); + return true; + case 1: + el->f_ct_.store(cur + N - 1, std::memory_order_release); + [[fallthrough]]; + default: + if (el->rc_.compare_exchange_weak( + cur_rc, cur_rc + rc_incr - 1, std::memory_order_release)) { + return true; + } break; } - std::this_thread::yield(); + ipc::yield(k); } - return true; } }; diff --git a/src/queue.h b/src/queue.h index c9c2eb4..82cb02c 100644 --- a/src/queue.h +++ b/src/queue.h @@ -81,29 +81,31 @@ public: } template - std::size_t connect(Elems* elems) { - if (elems == nullptr) return invalid_value; + auto connect(Elems* elems) + -> std::tuple().cursor())> { + if (elems == nullptr) return {}; if (connected_) { - // if it's already connected, just return an error count - return invalid_value; + // if it's already connected, just return false + return {}; } connected_ = true; - auto ret = elems->connect(); + elems->connect(); + auto ret = std::make_tuple(true, elems->cursor()); cc_waiter_.broadcast(); return ret; } template - std::size_t disconnect(Elems* elems) { - if (elems == nullptr) return invalid_value; + bool disconnect(Elems* elems) { + if (elems == nullptr) return false; if (!connected_) { - // if it's already disconnected, just return an error count - return invalid_value; + // if it's already disconnected, just return false + return false; } connected_ = false; - auto ret = elems->disconnect(); + elems->disconnect(); cc_waiter_.broadcast(); - return ret; + return true; } template @@ -155,11 +157,16 @@ public: return elems_; } - std::size_t connect() { - return base_t::connect(elems_); + bool connect() { + auto tp = base_t::connect(elems_); + if (std::get<0>(tp)) { + cursor_ = std::get<1>(tp); + return true; + } + return false; } - std::size_t disconnect() { + bool disconnect() { return base_t::disconnect(elems_); } @@ -186,9 +193,6 @@ public: base_t::close(old); } else base_t::open(elems_, name); - if (elems_ != nullptr) { - cursor_ = elems_->cursor(); - } return old; } diff --git a/test/test_circ.cpp b/test/test_circ.cpp index 9f60ee5..63e87d3 100644 --- a/test/test_circ.cpp +++ b/test/test_circ.cpp @@ -183,12 +183,12 @@ struct test_cq> { cn_t* connect() { cn_t* queue = new cn_t { ca_ }; - [&] { QVERIFY(queue->connect() != ipc::invalid_value); } (); + [&] { QVERIFY(queue->connect()); } (); return queue; } void disconnect(cn_t* queue) { - QVERIFY(queue->disconnect() != ipc::invalid_value); + QVERIFY(queue->disconnect()); QVERIFY(queue->detach() != nullptr); delete queue; } @@ -241,7 +241,7 @@ private slots: #include "test_circ.moc" -constexpr int LoopCount = 1000000; +constexpr int LoopCount = 10000000; //constexpr int LoopCount = 1000/*0000*/; void Unit::initTestCase() { @@ -270,6 +270,13 @@ void test_prod_cons() { } void Unit::test_prod_cons_1v1() { +// ea_t< +// sizeof(msg_t), +// pc_t +// > el_arr_mmb; +// benchmark_prod_cons<1, 1, LoopCount, void>(&el_arr_mmb); +// benchmark_prod_cons<2, 1, LoopCount, void>(&el_arr_mmb); + ea_t< sizeof(msg_t), pc_t @@ -387,7 +394,7 @@ void Unit::test_queue() { queue.attach(cq); QVERIFY(queue.detach() != nullptr); - ipc::detail::static_for(std::make_index_sequence<8>{}, [](auto index) { + ipc::detail::static_for(std::make_index_sequence<16>{}, [](auto index) { benchmark_prod_cons<1, decltype(index)::value + 1, LoopCount>((queue_t*)nullptr); }); } diff --git a/test/test_ipc.cpp b/test/test_ipc.cpp index 72dc0ff..6d0c544 100644 --- a/test/test_ipc.cpp +++ b/test/test_ipc.cpp @@ -402,7 +402,7 @@ void Unit::test_route_rtt() { void Unit::test_route_performance() { //return; - ipc::detail::static_for(std::make_index_sequence<8>{}, [](auto index) { + ipc::detail::static_for(std::make_index_sequence<16>{}, [](auto index) { test_prod_cons(); }); test_prod_cons(); // test & verify @@ -476,13 +476,13 @@ void Unit::test_channel_rtt() { } void Unit::test_channel_performance() { - ipc::detail::static_for(std::make_index_sequence<8>{}, [](auto index) { + ipc::detail::static_for(std::make_index_sequence<16>{}, [](auto index) { test_prod_cons(); }); - ipc::detail::static_for(std::make_index_sequence<8>{}, [](auto index) { + ipc::detail::static_for(std::make_index_sequence<16>{}, [](auto index) { test_prod_cons(); }); - ipc::detail::static_for(std::make_index_sequence<8>{}, [](auto index) { + ipc::detail::static_for(std::make_index_sequence<16>{}, [](auto index) { test_prod_cons(); });