Ita*_*atz 6 c++ multithreading std c++17
我正在使用 C++17 并行标准库算法和std::execution::par执行策略。我在一台 4 核笔记本电脑上使用 Ubuntu,使用 clang 11 编译器和 VS Code 的 cmake 扩展进行构建(尽管我也检查了简单的单命令行编译而不使用 cmake)。
根据以下观察,该程序似乎仅使用 1 个线程:
std::execution::seq(常规、顺序算法)top -H,我只看到 1 个线程,CPU 使用率约为 100%sort使用 Ubuntu 的系统监视器,我看到一个核心在执行过程中处于活动状态(但如果我重复使用 for 循环,则活动核心可能会在不同调用之间发生变化)。代码示例:
#include <vector>
#include <iostream>
#include <algorithm>
#include <execution>
#include <chrono>
#include <thread>
int main()
{
const int N = 10000000;
std::vector<int> vec(N);
std::chrono::duration<double> elapsed;
unsigned int nThreads = std::thread::hardware_concurrency();
std::cout << "number of available threads: " << nThreads << "\n"; // this prints "4"
auto tstart = std::chrono::high_resolution_clock::now();
std::generate(vec.begin(), vec.end(), []() {return rand() % 100;});
//std::sort(std::execution::seq, vec.begin(), vec.end());
std::sort(std::execution::par, vec.begin(), vec.end());
auto tfinish = std::chrono::high_resolution_clock::now();
elapsed = tfinish - tstart;
std::cout << "Elapsed time: " << elapsed.count() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想也许问题是我没有告诉 cmake 链接到pthread库。所以我改变了CMakeLists.txt:
project(my_proj LANGUAGES C CXX)
find_package (Threads)
target_link_libraries (my_proj ${CMAKE_THREAD_LIBS_INIT})
Run Code Online (Sandbox Code Playgroud)
但它并没有做出任何改变。
为什么它看起来不像并行运行?
正如 @ildjarn 指出的,libstdc++需要 Intel TBB来实现并行执行策略:
注 3:并行算法对 Intel TBB 2018 或更高版本具有外部依赖性。如果包含标头,则必须使用 -ltbb 链接到 TBB。
libstdc++根据您使用的标头版本,如果 TBB 标头不在包含路径中,它可能会默默地回退到顺序执行。检查 TBB 是否在路径中的一种方法是尝试显式包含 TBB 标头之一:
#include <tbb/parallel_for.h>
Run Code Online (Sandbox Code Playgroud)
当然,如果 TBB 不在您的搜索路径中,则不会默默失败。
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |