From acdcc574901426dd2e4879d1c4df3924dba8f44b Mon Sep 17 00:00:00 2001 From: GeLee-Q <865038696@qq.com> Date: Fri, 28 Jan 2022 20:57:45 +0800 Subject: [PATCH 1/3] 1 --- main.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 73 insertions(+), 24 deletions(-) diff --git a/main.cpp b/main.cpp index a1d2625..ae497cc 100644 --- a/main.cpp +++ b/main.cpp @@ -5,15 +5,23 @@ #include #include #include "ticktock.h" +#include +#include +#include +#include +#include + // TODO: 并行化所有这些 for 循环 template std::vector fill(std::vector &arr, Func const &func) { TICK(fill); - for (size_t i = 0; i < arr.size(); i++) { + const size_t n = arr.size(); + tbb::task_arena ta(4); + tbb::parallel_for((size_t)0, (size_t)n,[&](size_t i){ arr[i] = func(i); - } + }); TOCK(fill); return arr; } @@ -21,9 +29,13 @@ std::vector fill(std::vector &arr, Func const &func) { template void saxpy(T a, std::vector &x, std::vector const &y) { TICK(saxpy); - for (size_t i = 0; i < x.size(); i++) { - x[i] = a * x[i] + y[i]; - } + const size_t n = x.size(); + tbb::parallel_for(tbb::blocked_range(0, n), + [&](tbb::blocked_range r){ + for(size_t i = r.begin(); i < r.end(); i++){ + x[i] = x[i]*a + y[i]; + } + }); TOCK(saxpy); } @@ -31,9 +43,16 @@ template T sqrtdot(std::vector const &x, std::vector const &y) { TICK(sqrtdot); T ret = 0; - for (size_t i = 0; i < std::min(x.size(), y.size()); i++) { - ret += x[i] * y[i]; - } + const size_t n = min(x.size(),y.size()); + ret = tbb::parallel_reduce(tbb::blocked_range(0, n),(T) 0, + [&](tbb::blocked_range r, T local_ret){ + for(size_t i = r.begin(); i < r.end(); i++){ + local_ret += x[i]*y[i]; + } + return local_ret; + },[](T x, T y){ + return x + y; + }); ret = std::sqrt(ret); TOCK(sqrtdot); return ret; @@ -43,10 +62,15 @@ template T minvalue(std::vector const &x) { TICK(minvalue); T ret = x[0]; - for (size_t i = 1; i < x.size(); i++) { - if (x[i] < ret) - ret = x[i]; - } + const size_t n = x.size(); + tbb::parallel_for(tbb::blocked_range(0,n), + [&](tbb::blocked_range r){ + for(size_t i = r.begin() ; i < r.end() ; ++i){ + if(x[i] < ret){ + ret = x[i]; + } + } + }); TOCK(minvalue); return ret; } @@ -55,14 +79,27 @@ template std::vector magicfilter(std::vector const &x, std::vector const &y) { TICK(magicfilter); std::vector res; - for (size_t i = 0; i < std::min(x.size(), y.size()); i++) { - if (x[i] > y[i]) { - res.push_back(x[i]); - } else if (y[i] > x[i] && y[i] > 0.5f) { - res.push_back(y[i]); - res.push_back(x[i] * y[i]); - } - } + std::mutex mtx; + const size_t n = min(x.size(),y.size()); + res.reserve(n); + tbb::task_arena ta(4); + ta.execute([&]{ + tbb::parallel_for(tbb::blocked_range(0,n), + [&](tbb::blocked_range r){ + std::vector local_res; + local_res.reserve(r.size()); + for(size_t i = r.begin(); i < r.end(); ++i ){ + if(x[i] > y[i]){ + local_res.push_back(x[i]); + }else if(y[i] > x[i] && y[i] > 0.5f){ + local_res.push_back(y[i]); + local_res.push_back(x[i] * y[i]); + } + } + std::lock_guard lck(mtx); + std::copy(local_res.begin(), local_res.end(), std::back_inserter(res)); + },tbb::auto_partitioner{}); + }); TOCK(magicfilter); return res; } @@ -71,10 +108,20 @@ template T scanner(std::vector &x) { TICK(scanner); T ret = 0; - for (size_t i = 0; i < x.size(); i++) { - ret += x[i]; - x[i] = ret; - } + const size_t n = x.size(); + ret = tbb::parallel_scan(tbb::blocked_range(0,n),(T) 0 , + [&](tbb::blocked_range r, T local_ret, auto is_final){ + for(size_t i = r.begin(); i < r.end(); ++i){ + local_ret += x[i]; + if(is_final){ + x[i] = local_ret; + } + } + return local_ret; + }, + []( T x , T y){ + return x + y; + }); TOCK(scanner); return ret; } @@ -100,3 +147,5 @@ int main() { return 0; } + + From d6c4f65b6fdf3ed80390b356e911dac4f0e3e500 Mon Sep 17 00:00:00 2001 From: GeLee-Q <865038696@qq.com> Date: Fri, 28 Jan 2022 21:06:39 +0800 Subject: [PATCH 2/3] Update main.cpp --- main.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main.cpp b/main.cpp index ae497cc..a126038 100644 --- a/main.cpp +++ b/main.cpp @@ -18,7 +18,6 @@ template std::vector fill(std::vector &arr, Func const &func) { TICK(fill); const size_t n = arr.size(); - tbb::task_arena ta(4); tbb::parallel_for((size_t)0, (size_t)n,[&](size_t i){ arr[i] = func(i); }); @@ -82,7 +81,7 @@ std::vector magicfilter(std::vector const &x, std::vector const &y) { std::mutex mtx; const size_t n = min(x.size(),y.size()); res.reserve(n); - tbb::task_arena ta(4); + tbb::task_arena ta(6); ta.execute([&]{ tbb::parallel_for(tbb::blocked_range(0,n), [&](tbb::blocked_range r){ From 825383394519ec157bfb778f09a8514bd491b15d Mon Sep 17 00:00:00 2001 From: GeLee-Q <865038696@qq.com> Date: Fri, 28 Jan 2022 21:39:36 +0800 Subject: [PATCH 3/3] Update main.cpp --- main.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/main.cpp b/main.cpp index a126038..7d3c93b 100644 --- a/main.cpp +++ b/main.cpp @@ -62,14 +62,23 @@ T minvalue(std::vector const &x) { TICK(minvalue); T ret = x[0]; const size_t n = x.size(); - tbb::parallel_for(tbb::blocked_range(0,n), - [&](tbb::blocked_range r){ - for(size_t i = r.begin() ; i < r.end() ; ++i){ - if(x[i] < ret){ - ret = x[i]; - } - } - }); +// tbb::parallel_for(tbb::blocked_range(0,n), +// [&](tbb::blocked_range r){ +// for(size_t i = r.begin() ; i < r.end() ; ++i){ +// if(x[i] < ret){ +// ret = x[i]; +// } +// } +// }); + tbb::parallel_reduce(tbb::blocked_range(0, n),(T) x[0], + [&](tbb::blocked_range r, T local_min){ + for(size_t i = r.begin(); i < r.end() ; i++){ + local_min = min(local_min,x[i]); + } + return local_min;}, + [](T x, T y){ + return min(x,y); + }); TOCK(minvalue); return ret; }