From 59eebcc1314a249a393e56d57635282703f94336 Mon Sep 17 00:00:00 2001 From: Yamada Date: Fri, 11 Feb 2022 20:43:48 +0900 Subject: [PATCH 01/19] Delete already deleted functions --- cpprb/ReplayBuffer.hh | 7 ------- 1 file changed, 7 deletions(-) diff --git a/cpprb/ReplayBuffer.hh b/cpprb/ReplayBuffer.hh index c0d64440..f12a1af9 100644 --- a/cpprb/ReplayBuffer.hh +++ b/cpprb/ReplayBuffer.hh @@ -486,13 +486,6 @@ namespace ymd { void set_eps(Priority eps){ this->eps = eps; } - - void weak_update_changed(){ - if constexpr (MultiThread) { - sum.weak_update_changed(); - min.weak_update_changed(); - } - } }; template From 95ceba946c2d4d6a4890fe553c247bdf2f3577c0 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 12:49:40 +0900 Subject: [PATCH 02/19] Use update without will_update --- cpprb/SegmentTree.hh | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 5b57ba34..77862fd3 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -150,29 +150,15 @@ namespace ymd { while(N){ auto copy_N = std::min(N,max-i); - std::generate_n(buffer+access_index(i),copy_N,f); - - if constexpr (!MultiThread){ - for(auto n = std::size_t(0); n < copy_N; ++n){ - auto _i = access_index(i+n); - if(_i != 0){ - will_update.insert(parent(_i)); - } - } + if constexpr (MultiThread){ + std::generate_n(buffer+access_index(i),copy_N,f); + }else{ + for(auto n = std::size_t(0); n < copy_N; ++n){ set(i+n, f()); } } N = (N > copy_N) ? N - copy_N: zero; i = zero; } - - if constexpr (!MultiThread) { - while(!will_update.empty()){ - i = *(will_update.rbegin()); - auto updated = update_buffer(i); - will_update.erase(i); - if(i && updated){ will_update.insert(parent(i)); } - } - } } void set(std::size_t i,T v,std::size_t N,std::size_t max = std::size_t(0)){ From 4050eb7a908e955a52b021e80095067fd285c4b5 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 13:03:31 +0900 Subject: [PATCH 03/19] Remove unused will_update instance --- cpprb/SegmentTree.hh | 2 -- 1 file changed, 2 deletions(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 77862fd3..79f6b282 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -142,8 +142,6 @@ namespace ymd { constexpr const std::size_t zero = 0; if(zero == max){ max = buffer_size; } - std::set will_update{}; - if constexpr (MultiThread){ if(N){ any_changed->store(true,std::memory_order_release); } } From d2dcd2da0e17aa85a38db517649e779776ca8f40 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 13:09:42 +0900 Subject: [PATCH 04/19] Add this expression --- cpprb/SegmentTree.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 79f6b282..6f87127a 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -151,7 +151,7 @@ namespace ymd { if constexpr (MultiThread){ std::generate_n(buffer+access_index(i),copy_N,f); }else{ - for(auto n = std::size_t(0); n < copy_N; ++n){ set(i+n, f()); } + for(auto n = std::size_t(0); n < copy_N; ++n){ this->set(i+n, f()); } } N = (N > copy_N) ? N - copy_N: zero; From c8c009797882bf293f5c5d9a992fa242811af078 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 16:07:47 +0900 Subject: [PATCH 05/19] Use numpy testing --- test/PyReplayBuffer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/PyReplayBuffer.py b/test/PyReplayBuffer.py index 825c2075..00f28cce 100644 --- a/test/PyReplayBuffer.py +++ b/test/PyReplayBuffer.py @@ -95,8 +95,8 @@ def test_5_done(self): class TestPrioritizedBase: def test_weights(self): self._check_ndarray(self.s['weights'],1,(self.batch_size,),"weights") - for w in self.s['weights']: - self.assertAlmostEqual(w,1.0) + np.testing.assert_allclose(self.s["weights"], + np.full_like(self.s["weights"], 1.0)) def test_indexes(self): self._check_ndarray(self.s['indexes'],1,(self.batch_size,),"indexes") From 26b99935d58716301df8d0c6743d182d49ec9214 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 16:42:48 +0900 Subject: [PATCH 06/19] Revert "Add this expression" This reverts commit d2dcd2da0e17aa85a38db517649e779776ca8f40. --- cpprb/SegmentTree.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 6f87127a..79f6b282 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -151,7 +151,7 @@ namespace ymd { if constexpr (MultiThread){ std::generate_n(buffer+access_index(i),copy_N,f); }else{ - for(auto n = std::size_t(0); n < copy_N; ++n){ this->set(i+n, f()); } + for(auto n = std::size_t(0); n < copy_N; ++n){ set(i+n, f()); } } N = (N > copy_N) ? N - copy_N: zero; From cb58a1ea8ff9fb175e9ecac2683ca33710a17c54 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 16:43:02 +0900 Subject: [PATCH 07/19] Revert "Remove unused will_update instance" This reverts commit 4050eb7a908e955a52b021e80095067fd285c4b5. --- cpprb/SegmentTree.hh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 79f6b282..77862fd3 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -142,6 +142,8 @@ namespace ymd { constexpr const std::size_t zero = 0; if(zero == max){ max = buffer_size; } + std::set will_update{}; + if constexpr (MultiThread){ if(N){ any_changed->store(true,std::memory_order_release); } } From 9b0f00e3ca7d54838e57d702dcbaa94324b84d4b Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 16:43:04 +0900 Subject: [PATCH 08/19] Revert "Use update without will_update" This reverts commit 95ceba946c2d4d6a4890fe553c247bdf2f3577c0. --- cpprb/SegmentTree.hh | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 77862fd3..5b57ba34 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -150,15 +150,29 @@ namespace ymd { while(N){ auto copy_N = std::min(N,max-i); - if constexpr (MultiThread){ - std::generate_n(buffer+access_index(i),copy_N,f); - }else{ - for(auto n = std::size_t(0); n < copy_N; ++n){ set(i+n, f()); } + std::generate_n(buffer+access_index(i),copy_N,f); + + if constexpr (!MultiThread){ + for(auto n = std::size_t(0); n < copy_N; ++n){ + auto _i = access_index(i+n); + if(_i != 0){ + will_update.insert(parent(_i)); + } + } } N = (N > copy_N) ? N - copy_N: zero; i = zero; } + + if constexpr (!MultiThread) { + while(!will_update.empty()){ + i = *(will_update.rbegin()); + auto updated = update_buffer(i); + will_update.erase(i); + if(i && updated){ will_update.insert(parent(i)); } + } + } } void set(std::size_t i,T v,std::size_t N,std::size_t max = std::size_t(0)){ From 2909258965ad270c02aac6e5310bad693eeed7c7 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 16:54:39 +0900 Subject: [PATCH 09/19] Remove will_update again --- cpprb/SegmentTree.hh | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 5b57ba34..357fc28c 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -142,8 +142,6 @@ namespace ymd { constexpr const std::size_t zero = 0; if(zero == max){ max = buffer_size; } - std::set will_update{}; - if constexpr (MultiThread){ if(N){ any_changed->store(true,std::memory_order_release); } } @@ -155,8 +153,10 @@ namespace ymd { if constexpr (!MultiThread){ for(auto n = std::size_t(0); n < copy_N; ++n){ auto _i = access_index(i+n); - if(_i != 0){ - will_update.insert(parent(_i)); + auto updated = true; + if((_i != zero) && updated){ + _i = parent(_i); + updated = update_buffer(_i); } } } @@ -164,15 +164,6 @@ namespace ymd { N = (N > copy_N) ? N - copy_N: zero; i = zero; } - - if constexpr (!MultiThread) { - while(!will_update.empty()){ - i = *(will_update.rbegin()); - auto updated = update_buffer(i); - will_update.erase(i); - if(i && updated){ will_update.insert(parent(i)); } - } - } } void set(std::size_t i,T v,std::size_t N,std::size_t max = std::size_t(0)){ From 13a22db31ec67348e71779099d670cc482dad20a Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 17:02:47 +0900 Subject: [PATCH 10/19] Fix: if -> while --- cpprb/SegmentTree.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 357fc28c..64424463 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -154,7 +154,7 @@ namespace ymd { for(auto n = std::size_t(0); n < copy_N; ++n){ auto _i = access_index(i+n); auto updated = true; - if((_i != zero) && updated){ + while((_i != zero) && updated){ _i = parent(_i); updated = update_buffer(_i); } From 8db7400d9ce79918668ae1b212769e7579ab1a1f Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 20:04:06 +0900 Subject: [PATCH 11/19] Remove reduce overhead --- cpprb/SegmentTree.hh | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 64424463..7517fa3d 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -181,7 +181,8 @@ namespace ymd { } auto largest_region_index(std::function condition, - std::size_t n=std::size_t(0)) { + std::size_t n=std::size_t(0), + T init = T{0}) { // max index of reduce( [0,index) ) -> true constexpr const std::size_t zero = 0; @@ -194,21 +195,30 @@ namespace ymd { } } - std::size_t min = zero; - auto max = (zero != n) ? n: buffer_size; + if(n == zero){ n = buffer_size; } + auto b = zero; - auto index = (min + max)/two; + if(condition(buffer[b])){ return n-1; } + + auto min = zero; + auto max = buffer_size; + auto cond = condition; + auto red = init; while(max - min > one){ - if( condition(_reduce(zero,index,zero,zero,buffer_size)) ){ - min = index; + auto b_left = child_left(b); + if(cond(buffer[b_left])){ + min = (min + max) / two; + red = f(red, buffer[b_left]); + cond = [=](auto v){ return condition(f(red,v)); }; + b = b_left; }else{ - max = index; + max = (min + max) / two; + b = child_right(b); } - index = (min + max)/two; } - return index; + return std::min(min, n-1); } void clear(T v = T{0}){ From 28d0cc5b2bfbb1dd3f4d8f77dcb5bc2f67527da9 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 20:13:08 +0900 Subject: [PATCH 12/19] Delete space --- cpprb/SegmentTree.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 7517fa3d..3468110c 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -210,7 +210,7 @@ namespace ymd { if(cond(buffer[b_left])){ min = (min + max) / two; red = f(red, buffer[b_left]); - cond = [=](auto v){ return condition(f(red,v)); }; + cond = [=](auto v){ return condition(f(red,v)); }; b = b_left; }else{ max = (min + max) / two; From 73bbf5994500d2f8b675fcd009427666e040e2c2 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 20:41:13 +0900 Subject: [PATCH 13/19] Fix child_left <-> child_right --- cpprb/SegmentTree.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 3468110c..7051d1ae 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -211,10 +211,10 @@ namespace ymd { min = (min + max) / two; red = f(red, buffer[b_left]); cond = [=](auto v){ return condition(f(red,v)); }; - b = b_left; + b = child_right(b); }else{ max = (min + max) / two; - b = child_right(b); + b = b_left; } } From cdda4caac20da458b7bbad30282cd7735d7880d7 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 21:06:56 +0900 Subject: [PATCH 14/19] Rename update_all -> update_init --- cpprb/SegmentTree.hh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 7051d1ae..38adf858 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -69,7 +69,7 @@ namespace ymd { return tmp != buffer[i]; } - void update_all(){ + void update_init(){ for(std::size_t i = access_index(0) -1, end = -1; i != end; --i){ update_buffer(i); } @@ -105,7 +105,7 @@ namespace ymd { if(initialize){ std::fill_n(buffer+access_index(0),n,v); - update_all(); + update_init(); } } SegmentTree(): SegmentTree{2,[](auto a,auto b){ return a+b; }} {} From 1ce44b73aa786659204bb99dd79c1252f993e31a Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 21:07:08 +0900 Subject: [PATCH 15/19] Add new method update_all() The method is optimized for small change --- cpprb/SegmentTree.hh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cpprb/SegmentTree.hh b/cpprb/SegmentTree.hh index 38adf858..218a4b2a 100644 --- a/cpprb/SegmentTree.hh +++ b/cpprb/SegmentTree.hh @@ -78,6 +78,22 @@ namespace ymd { } } + void update_all(){ + constexpr const std::size_t zero = 0; + const auto end = parent(access_index(buffer_size-1))+1; + for(auto i = parent(access_index(0)); i != end; ++i){ + auto updated = update_buffer(i); + auto _i = i; + while((_i != zero) && updated){ + _i = parent(_i); + updated = update_buffer(_i); + } + } + if constexpr (MultiThread){ + any_changed->store(false,std::memory_order_release); + } + } + public: SegmentTree(std::size_t n,F f, T v = T{0}, T* buffer_ptr = nullptr, From 172e8e98e1cbf2936c0c3c376ae88e103e026935 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 21:21:57 +0900 Subject: [PATCH 16/19] Benchmark script for Segment Tree --- test/segmenttree_bench.cpp | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 test/segmenttree_bench.cpp diff --git a/test/segmenttree_bench.cpp b/test/segmenttree_bench.cpp new file mode 100644 index 00000000..d1f40bae --- /dev/null +++ b/test/segmenttree_bench.cpp @@ -0,0 +1,52 @@ +#include +#include + +#include + +auto bench = [](auto&& F, auto n, auto fmt=""){ + auto t1 = std::chrono::high_resolution_clock::now(); + for(auto i=0ul; i < n; ++i){ F(); } + auto t2 = std::chrono::high_resolution_clock::now(); + + std::cout << fmt + << std::chrono::duration_cast(t2-t1).count() + << std::endl; + }; + + +int main(int argc, char** argv){ + constexpr const auto buffer_size = 1000000ul; + constexpr const auto size = ymd::PowerOf2(buffer_size); + + auto sum = ymd::SegmentTree(size, [](auto a, auto b){ return a+b; }); + auto sum2 = ymd::SegmentTree(size, [](auto a, auto b){ return a+b; }); + + bench([&,i=0, j=0]() mutable { sum.set(i++, j++); }, 10000, "sum1.set A: "); + bench([&,i=0]() mutable { sum.set(100*(i++), + [j=0]()mutable{ return j++; }, + 100, + buffer_size); }, 100, "sum1.set B: "); + bench([&]() mutable { sum.reduce(0, 20000); }, 1, "sum1.red A: "); + bench([&]() mutable { sum.reduce(0, 20000); }, 1, "sum1.red B: "); + bench([&,i=0]() mutable { + sum.largest_region_index([&](auto v){ return v <= 79.8*(i++); }, 20000); + }, + 10000, "sum1.lridx: "); + + bench([&,i=0, j=0]() mutable { sum2.set(i++, j++); }, 10000, "sum2.set A: "); + bench([&,i=0]() mutable { sum2.set(100*(i++), + [j=0]()mutable{ return j++; }, + 100, + buffer_size); }, 100, "sum2.set B: "); + bench([&]() mutable { sum2.reduce(0, 20000); }, 1, "sum2.red A: "); + bench([&]() mutable { sum2.reduce(0, 20000); }, 1, "sum2.red B: "); + bench([&,i=0]() mutable { + sum2.largest_region_index([&](auto v){ return v <= 79.8*(i++); }, 20000); + }, + 10000, "sum2.lridx: "); + + std::cout << sum.get(1) << " " << sum2.get(1) << std::endl; + std::cout << sum.get(1001) << " " << sum2.get(1001) << std::endl; + + return 0; +} From 6a9b6d9276be4b36c0ac958eb05fc1df6bd1e2eb Mon Sep 17 00:00:00 2001 From: Yamada Date: Sat, 12 Feb 2022 21:23:38 +0900 Subject: [PATCH 17/19] Remove space --- cpprb/ReplayBuffer.hh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpprb/ReplayBuffer.hh b/cpprb/ReplayBuffer.hh index f12a1af9..5f7f6eff 100644 --- a/cpprb/ReplayBuffer.hh +++ b/cpprb/ReplayBuffer.hh @@ -376,7 +376,7 @@ namespace ymd { sum{PowerOf2(buffer_size),[](auto a,auto b){ return a+b; }, Priority{0}, sum_ptr,sum_anychanged,initialize}, - min{PowerOf2(buffer_size),[](Priority a,Priority b){ return std::min(a,b); }, + min{PowerOf2(buffer_size),[](Priority a,Priority b){ return std::min(a,b); }, std::numeric_limits::max(), min_ptr,min_anychanged,initialize}, g{std::random_device{}()}, From 89558c9d9d869978a83076ccf9aa83f67acb44b7 Mon Sep 17 00:00:00 2001 From: Yamada Date: Sun, 13 Feb 2022 06:55:38 +0900 Subject: [PATCH 18/19] Update benchmark --- test/segmenttree_bench.cpp | 83 +++++++++++++++++++++++++++++++------- 1 file changed, 68 insertions(+), 15 deletions(-) diff --git a/test/segmenttree_bench.cpp b/test/segmenttree_bench.cpp index d1f40bae..b402fd85 100644 --- a/test/segmenttree_bench.cpp +++ b/test/segmenttree_bench.cpp @@ -1,7 +1,14 @@ +#include #include +#include #include +#include #include +#include + +using PER = ymd::CppPrioritizedSampler; +using MPPER = ymd::CppThreadSafePrioritizedSampler; auto bench = [](auto&& F, auto n, auto fmt=""){ auto t1 = std::chrono::high_resolution_clock::now(); @@ -22,31 +29,77 @@ int main(int argc, char** argv){ auto sum2 = ymd::SegmentTree(size, [](auto a, auto b){ return a+b; }); bench([&,i=0, j=0]() mutable { sum.set(i++, j++); }, 10000, "sum1.set A: "); - bench([&,i=0]() mutable { sum.set(100*(i++), - [j=0]()mutable{ return j++; }, - 100, - buffer_size); }, 100, "sum1.set B: "); - bench([&]() mutable { sum.reduce(0, 20000); }, 1, "sum1.red A: "); - bench([&]() mutable { sum.reduce(0, 20000); }, 1, "sum1.red B: "); + bench([&,i=100]() mutable { sum.set(100*(i++), + [j=0]()mutable{ return j++; }, + 100, + buffer_size); }, 100, "sum1.set B: "); + bench([&,i=20]() mutable { sum.set(1000*(i++), + [j=0]()mutable{ return j++; }, + 1000, + buffer_size); }, 10, "sum1.set C: "); + bench([&]() mutable { sum.reduce(0, 30000); }, 1, "sum1.red A: "); + bench([&]() mutable { sum.reduce(0, 30000); }, 1, "sum1.red B: "); bench([&,i=0]() mutable { - sum.largest_region_index([&](auto v){ return v <= 79.8*(i++); }, 20000); + sum.largest_region_index([&](auto v){ return v <= 79.8*(i++); }, 30000); }, 10000, "sum1.lridx: "); bench([&,i=0, j=0]() mutable { sum2.set(i++, j++); }, 10000, "sum2.set A: "); - bench([&,i=0]() mutable { sum2.set(100*(i++), - [j=0]()mutable{ return j++; }, - 100, - buffer_size); }, 100, "sum2.set B: "); - bench([&]() mutable { sum2.reduce(0, 20000); }, 1, "sum2.red A: "); - bench([&]() mutable { sum2.reduce(0, 20000); }, 1, "sum2.red B: "); + bench([&,i=100]() mutable { sum2.set(100*(i++), + [j=0]()mutable{ return j++; }, + 100, + buffer_size); }, 100, "sum2.set B: "); + bench([&,i=20]() mutable { sum2.set(1000*(i++), + [j=0]()mutable{ return j++; }, + 1000, + buffer_size); }, 10, "sum2.set C: "); + bench([&]() mutable { sum2.reduce(0, 30000); }, 1, "sum2.red A: "); + bench([&]() mutable { sum2.reduce(0, 30000); }, 1, "sum2.red B: "); bench([&,i=0]() mutable { - sum2.largest_region_index([&](auto v){ return v <= 79.8*(i++); }, 20000); + sum2.largest_region_index([&](auto v){ return v <= 79.8*(i++); }, 30000); }, 10000, "sum2.lridx: "); std::cout << sum.get(1) << " " << sum2.get(1) << std::endl; - std::cout << sum.get(1001) << " " << sum2.get(1001) << std::endl; + std::cout << sum.get(10001) << " " << sum2.get(10001) << std::endl; + + // + + constexpr const auto alpha = 0.5, beta = 0.4; + auto per = PER(buffer_size, alpha); + auto mpper = MPPER(buffer_size, alpha); + + auto p = std::vector{}; + p.reserve(10000); + std::generate_n(std::back_inserter(p), 10000, + [i=0]() mutable { return 0.02*(i++ % 321); }); + + auto indexes = std::vector{}; + indexes.reserve(32); + auto weights = std::vector{}; + weights.reserve(32); + + bench([&, i=0,j=0]() mutable { per.set_priorities(i++, 0.02*(j++ % 321)); }, + 10000, " PER.add1: "); + bench([&, i=100,j=0]() mutable { + per.set_priorities(100*(i++), p.data()+100*(j++), 100, buffer_size); + }, + 100, " PER.addN: "); + bench([&]() mutable { per.sample(32,beta,weights,indexes,20000); }, + 1, " PER.smpA: "); + bench([&]() mutable { per.sample(32,beta,weights,indexes,20000); }, + 1, " PER.smpB: "); + + bench([&, i=0,j=0]() mutable { mpper.set_priorities(i++, 0.02*(j++ % 321)); }, + 10000, "MPPER.add1: "); + bench([&, i=100,j=0]() mutable { + mpper.set_priorities(100*(i++), p.data()+100*(j++), 100, buffer_size); + }, + 100, "MPPER.addN: "); + bench([&]() mutable { mpper.sample(32,beta,weights,indexes,20000); }, + 1, "MPPER.smpA: "); + bench([&]() mutable { mpper.sample(32,beta,weights,indexes,20000); }, + 1, "MPPER.smpB: "); return 0; } From 0f39eb54582eb53b00dd22a0ecc4cc5a1c50bd4f Mon Sep 17 00:00:00 2001 From: Yamada Date: Sun, 13 Feb 2022 10:53:44 +0900 Subject: [PATCH 19/19] Add Segment Tree / ReplayBuffer benchmark --- .gitlab-ci.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cb40d16c..6ee4c857 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -122,6 +122,24 @@ SegmentTree.cpp: - $CXX -o test/SegmentTree test/SegmentTree.cpp - test/SegmentTree + +cpp_bench: + image: *dev_image + stage: bench_mark_test + needs: + - job: ReplayBuffer.cpp + artifacts: false + - job: SegmentTree.cpp + artifacts: false + script: + - $CXX -o test/segmenttree_bench test/segmenttree_bench.cpp + - test/segmenttree_bench + - test/segmenttree_bench + - test/segmenttree_bench + - test/segmenttree_bench + - test/segmenttree_bench + + ReplayBuffer: <<: *py_setup script: