GCC9 支持c++17 stl 并行算法,所以我们安装一下,尝尝鲜。主要参考了这个下面的两个博客(就是无脑抄袭)
C++17 STL Parallel Algorithms - with GCC 9.1 and Intel TBB on Linux and macOSsolarianprogrammer.com Are C++17 Parallel Algorithms implemented already?stackoverflow.com![1d404d4d667267eda171581d6e8ef81a.png](https://i-blog.csdnimg.cn/blog_migrate/86230094ef4148523b6459439f769317.png)
1.安装gcc9
# Install GCC 9
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-9 g++-9
2. 安装tbb
- 下载tbb,并cd 到目录
wget https://github.com/intel/tbb/archive/2019_U8.tar.gz
tar zxvf 2019_U8.tar.gz
rm 2019_U8.tar.gz
cd tbb-2019_U8
- 编辑linux.gcc-9.inc
cp build/linux.gcc.inc build/linux.gcc-9.inc
# 使用vscode 编辑文件
code -n build/linux.gcc-9.inc
# 把大约是15,16 行的CPLUS ?= g++ CONLY ?= gcc修改为下面语句,然后保存
CPLUS ?= g++-9
CONLY ?= gcc-9
- 编译tbb
make compiler=gcc-9 stdver=c++17 tbb_build_prefix=my_tbb_build
- 安装tbb
sudo mkdir /usr/local/tbb-2019_U8
sudo cp -r include /usr/local/tbb-2019_U8/include
sudo ln -s /usr/local/tbb-2019_U8/include/tbb /usr/local/include/tbb
sudo cp -r build/my_tbb_build_release /usr/local/tbb-2019_U8/lib
sudo ln -s /usr/local/tbb-2019_U8/lib/libtbb.so.2 /usr/local/lib/libtbb.so
sudo ln -s /usr/local/tbb-2019_U8/lib/libtbbmalloc.so.2 /usr/local/lib/libtbbmalloc.so
sudo ln -s /usr/local/tbb-2019_U8/lib/libtbbmalloc_proxy.so.2 /usr/local/lib/libtbbmalloc_proxy.so
echo 'export LD_LIBRARY_PATH=/usr/local/tbb-2019_U8/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
3.测试
- 测试代码
#include <algorithm>
#include <chrono>
#include <execution>
#include <iostream>
#include <random>
#include <vector>
void printDuration(std::chrono::steady_clock::time_point start, std::chrono::steady_clock::time_point end, const char *message)
{
auto diff = end - start;
std::cout << message << ' ' << std::chrono::duration<double, std::milli>(diff).count() << " msn";
}
template <typename T>
void test(const T &policy, const std::vector<double> &data, const int repeat, const char *message)
{
for (int i = 0; i < repeat; ++i)
{
std::vector<double> curr_data(data);
const auto start = std::chrono::steady_clock::now();
std::sort(policy, curr_data.begin(), curr_data.end());
const auto end = std::chrono::steady_clock::now();
printDuration(start, end, message);
}
std::cout << 'n';
}
int main()
{
// Test samples and repeat factor
constexpr size_t samples{5'000'000};
constexpr int repeat{10};
// Fill a vector with samples numbers
std::random_device rd;
std::mt19937_64 mre(rd());
std::uniform_real_distribution<double> urd(0.0, 1.0);
std::vector<double> data(samples);
for (auto &e : data)
{
e = urd(mre);
}
// Sort data using different execution policies
std::cout << "std::execution::seqn";
test(std::execution::seq, data, repeat, "Elapsed time");
std::cout << "std::execution::parn";
test(std::execution::par, data, repeat, "Elapsed time");
}
- 编译程序
g++-9 -std=c++17 -Wall -Wextra -pedantic -O2 t0.cpp -o t0_opt -L /usr/local/lib/ -ltbb
- 运行代码
./t0_opt