From 21527f6933b3333b59ec79f4fc501ddc0000aee9 Mon Sep 17 00:00:00 2001 From: lulongfei Date: Sat, 22 Jan 2022 23:19:52 +0800 Subject: [PATCH 1/3] update codes --- main.cpp | 145 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 114 insertions(+), 31 deletions(-) diff --git a/main.cpp b/main.cpp index a1d2625..30b5e21 100644 --- a/main.cpp +++ b/main.cpp @@ -4,16 +4,27 @@ #include #include #include +#include +#include +#include +#include +#include #include "ticktock.h" - // TODO: 并行化所有这些 for 循环 template std::vector fill(std::vector &arr, Func const &func) { TICK(fill); - for (size_t i = 0; i < arr.size(); i++) { - arr[i] = func(i); - } + auto n = arr.size(); + tbb::parallel_for(tbb::blocked_range(0, n), + [&](tbb::blocked_range r) { + for (size_t i = r.begin(); i < r.end(); i++) { + arr[i] = func(i); + } + }); + //for (size_t i = 0; i < arr.size(); i++) { + // arr[i] = func(i); + //} TOCK(fill); return arr; } @@ -21,9 +32,17 @@ 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]; - } + auto n = std::min(x.size(), y.size()); + tbb::parallel_for(tbb::blocked_range(0, n), + [&](tbb::blocked_range r) { + for (size_t i = r.begin(); i < r.end(); i++) { + //arr[i] = func(i); + x[i] = a * x[i] + y[i]; + } + }); + //for (size_t i = 0; i < x.size(); i++) { + // x[i] = a * x[i] + y[i]; + //} TOCK(saxpy); } @@ -31,10 +50,25 @@ 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]; - } - ret = std::sqrt(ret); + auto n = std::min(x.size(), y.size()); + tbb::task_arena ta(4); + auto res = tbb::parallel_reduce(tbb::blocked_range(0, n), (T)0, + [&](tbb::blocked_range r, T local_res) { + for (size_t i = r.begin(); i < r.end(); ++i) + { + local_res += x[i] * y[i]; + } + return local_res; + }, [](T x, T y) + { + return x + y; + }); + + //for (size_t i = 0; i < std::min(x.size(), y.size()); i++) { + // ret += x[i] * y[i]; + //} + ret = std::sqrt(res); + //ret = std::sqrt(ret); TOCK(sqrtdot); return ret; } @@ -42,11 +76,21 @@ T sqrtdot(std::vector const &x, std::vector const &y) { 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]; - } + auto n = x.size(); + T ret = x[0]; + + 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]; + } + }); + + //for (size_t i = 1; i < x.size(); i++) { + // if (x[i] < ret) + // ret = x[i]; + //} TOCK(minvalue); return ret; } @@ -55,14 +99,35 @@ 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]); + auto n = std::min(x.size(), y.size()); + res.reserve(n * 2 / 3); + std::mutex mtx; + + tbb::parallel_for(tbb::blocked_range(0, n), + [&](tbb::blocked_range r) { + std::vector local_a; + local_a.reserve(n); + for (size_t i = r.begin(); i < r.end(); ++i) { + if (x[i] > y[i]) { + local_a.push_back(x[i]); + } + else if (y[i] > x[i] && y[i] > 0.5f) { + local_a.push_back(y[i]); + local_a.push_back(x[i] * y[i]); + } + } + std::lock_guard grd(mtx); + std::copy(local_a.begin(), local_a.end(), std::back_inserter(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]); + // } + //} TOCK(magicfilter); return res; } @@ -71,10 +136,26 @@ 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; - } + //for (size_t i = 0; i < x.size(); i++) { + // ret += x[i]; + // x[i] = ret; + //} + + auto n = x.size(); + ret = tbb::parallel_scan(tbb::blocked_range(0, n), (T)0, + [&](tbb::blocked_range r, T local_res, auto is_final) { + for (size_t i = r.begin(); i < r.end(); ++i) { + local_res += x[i]; + if (is_final) { + x[i] = local_res; + } + } + + return local_res; + }, [](float x, float y) { + return x + y; + }); + TOCK(scanner); return ret; } @@ -92,11 +173,13 @@ int main() { std::cout << sqrtdot(x, y) << std::endl; std::cout << minvalue(x) << std::endl; - auto arr = magicfilter(x, y); - std::cout << arr.size() << std::endl; + auto arr = magicfilter(x, y); + std::cout << arr.size() << std::endl; + + scanner(x); + std::cout << std::reduce(x.begin(), x.end()) << std::endl; - scanner(x); - std::cout << std::reduce(x.begin(), x.end()) << std::endl; + std::getchar(); return 0; } From 4831eea1ae480138213d4305f5cf77c58484f3d5 Mon Sep 17 00:00:00 2001 From: lulongfei Date: Sat, 22 Jan 2022 23:35:02 +0800 Subject: [PATCH 2/3] covert tab to indent --- main.cpp | 88 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/main.cpp b/main.cpp index 30b5e21..4695a1e 100644 --- a/main.cpp +++ b/main.cpp @@ -32,14 +32,14 @@ std::vector fill(std::vector &arr, Func const &func) { template void saxpy(T a, std::vector &x, std::vector const &y) { TICK(saxpy); - auto n = std::min(x.size(), y.size()); - tbb::parallel_for(tbb::blocked_range(0, n), - [&](tbb::blocked_range r) { - for (size_t i = r.begin(); i < r.end(); i++) { - //arr[i] = func(i); + auto n = std::min(x.size(), y.size()); + tbb::parallel_for(tbb::blocked_range(0, n), + [&](tbb::blocked_range r) { + for (size_t i = r.begin(); i < r.end(); i++) { + //arr[i] = func(i); x[i] = a * x[i] + y[i]; - } - }); + } + }); //for (size_t i = 0; i < x.size(); i++) { // x[i] = a * x[i] + y[i]; //} @@ -52,17 +52,17 @@ T sqrtdot(std::vector const &x, std::vector const &y) { T ret = 0; auto n = std::min(x.size(), y.size()); tbb::task_arena ta(4); - auto res = tbb::parallel_reduce(tbb::blocked_range(0, n), (T)0, - [&](tbb::blocked_range r, T local_res) { - for (size_t i = r.begin(); i < r.end(); ++i) - { - local_res += x[i] * y[i]; - } - return local_res; - }, [](T x, T y) - { - return x + y; - }); + auto res = tbb::parallel_reduce(tbb::blocked_range(0, n), (T)0, + [&](tbb::blocked_range r, T local_res) { + for (size_t i = r.begin(); i < r.end(); ++i) + { + local_res += x[i] * y[i]; + } + return local_res; + }, [](T x, T y) + { + return x + y; + }); //for (size_t i = 0; i < std::min(x.size(), y.size()); i++) { // ret += x[i] * y[i]; @@ -77,15 +77,15 @@ template T minvalue(std::vector const &x) { TICK(minvalue); auto n = x.size(); - T ret = x[0]; + T ret = x[0]; tbb::parallel_for(tbb::blocked_range(0, n), - [&](tbb::blocked_range r) { - for (size_t i = r.begin(); i < r.end(); i++) { + [&](tbb::blocked_range r) { + for (size_t i = r.begin(); i < r.end(); i++) { if (x[i] < ret) ret = x[i]; - } - }); + } + }); //for (size_t i = 1; i < x.size(); i++) { // if (x[i] < ret) @@ -99,9 +99,9 @@ template std::vector magicfilter(std::vector const &x, std::vector const &y) { TICK(magicfilter); std::vector res; - auto n = std::min(x.size(), y.size()); + auto n = std::min(x.size(), y.size()); res.reserve(n * 2 / 3); - std::mutex mtx; + std::mutex mtx; tbb::parallel_for(tbb::blocked_range(0, n), [&](tbb::blocked_range r) { @@ -116,8 +116,8 @@ std::vector magicfilter(std::vector const &x, std::vector const &y) { local_a.push_back(x[i] * y[i]); } } - std::lock_guard grd(mtx); - std::copy(local_a.begin(), local_a.end(), std::back_inserter(res)); + std::lock_guard grd(mtx); + std::copy(local_a.begin(), local_a.end(), std::back_inserter(res)); } ); //for (size_t i = 0; i < std::min(x.size(), y.size()); i++) { @@ -142,19 +142,19 @@ T scanner(std::vector &x) { //} auto n = x.size(); - ret = tbb::parallel_scan(tbb::blocked_range(0, n), (T)0, - [&](tbb::blocked_range r, T local_res, auto is_final) { - for (size_t i = r.begin(); i < r.end(); ++i) { - local_res += x[i]; - if (is_final) { - x[i] = local_res; - } - } - - return local_res; - }, [](float x, float y) { - return x + y; - }); + ret = tbb::parallel_scan(tbb::blocked_range(0, n), (T)0, + [&](tbb::blocked_range r, T local_res, auto is_final) { + for (size_t i = r.begin(); i < r.end(); ++i) { + local_res += x[i]; + if (is_final) { + x[i] = local_res; + } + } + + return local_res; + }, [](float x, float y) { + return x + y; + }); TOCK(scanner); return ret; @@ -173,11 +173,11 @@ int main() { std::cout << sqrtdot(x, y) << std::endl; std::cout << minvalue(x) << std::endl; - auto arr = magicfilter(x, y); - std::cout << arr.size() << std::endl; + auto arr = magicfilter(x, y); + std::cout << arr.size() << std::endl; - scanner(x); - std::cout << std::reduce(x.begin(), x.end()) << std::endl; + scanner(x); + std::cout << std::reduce(x.begin(), x.end()) << std::endl; std::getchar(); From 693960dc40b4088753f47b24f62288b9a9c0c639 Mon Sep 17 00:00:00 2001 From: lulongfei Date: Sat, 22 Jan 2022 23:36:23 +0800 Subject: [PATCH 3/3] update cmake file --- CMakeLists.txt | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0d6a8f8..87cdde8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,15 +3,23 @@ cmake_minimum_required(VERSION 3.10) set(CMAKE_CXX_STANDARD 17) set(CMAKE_BUILD_TYPE Release) -project(main LANGUAGES CXX) - -add_executable(main main.cpp) +project(concurrent_vector LANGUAGES CXX) +file(GLOB_RECURSE SRC_FILES src/concurrent_vector/*.cpp CONFIGURE_DEPENDS true) +add_executable(concurrent_vector ${SRC_FILES}) #find_package(OpenMP REQUIRED) #target_link_libraries(main PUBLIC OpenMP::OpenMP_CXX) -find_package(TBB REQUIRED) -target_link_libraries(main PUBLIC TBB::tbb) +target_include_directories(concurrent_vector PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/oneapi-tbb-2021.5.0/include ${CMAKE_CURRENT_SOURCE_DIR}) +target_link_directories(concurrent_vector PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/oneapi-tbb-2021.5.0/lib/intel64/vc14) + +target_link_libraries(concurrent_vector PUBLIC tbb.lib) + +# find_package(TBB REQUIRED) +# target_link_libraries(main PUBLIC TBB::tbb) #find_package(benchmark REQUIRED) -#target_link_libraries(main PUBLIC benchmark::benchmark) +# set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Turn off the fking test") +# add_subdirectory(benchmark) +# target_link_libraries(main PUBLIC benchmark) +#target_link_libraries(main PUBLIC benchmark::benchmark) \ No newline at end of file