std::execution::par 不会生成线程

问题描述 投票:0回答:1

我正在尝试并行处理

problems
中包含的
vector
。为此,我想首先尝试避免
std::thread
,因为 std 提供了应该涵盖我的用例的并行执行方法。我对如何应用的理解是这样的:

std::vector<SolutionT> solution_vector;
std::mutex mut;
std::for_each(std::execution::par, problems.begin(), problems.end(), [&](const auto& problem) {
   auto solution = do_heavy_work(problem)
   std::lock_guard guard(mut);
   solution_vector.emplace_back(solution);
}

在 CMake 中,我还将线程库添加到可执行文件中(尽管不确定是否有必要?):

find_package(Threads REQUIRED)
target_link_libraries(
        executable 
        PRIVATE 
        Threads::Threads
)

问题的解决时间从仅仅几毫秒到几十秒不等,因为我的向量中有一千个问题,而且大多数都是较大的问题,所以我期望并行性能够大大加快这个处理时间。

但是,当我运行代码时,我没有观察到生成任何线程。我使用

htop
检查进程,发现只有一个核心被推至 100%,而其余核心则处于空闲状态。

我期望线程与 std::execution::par 结合生成是错误的吗?我是否错过了正确的步骤?

这是在具有 GCC 11.4 和 c++20 的 18 核 Intel x86_64 Ubuntu 22.04 平台上进行测试的。

编辑: 这是一个反映我用法的 godbolt 示例:https://godbolt.org/z/EEMEWr3Wa

c++ multithreading std c++20
1个回答
0
投票

从链接中查看生成的 code 行(生成的代码的第 228 行及更多)。

movaps XMMWORD PTR [rsp+0x30],xmm0
 movdqa xmm0,XMMWORD PTR [rip+0x0]        # 230 <heavy_work[abi:cxx11](std::shared_ptr<int> const&)+0x1c0>
    R_X86_64_PC32 .LC5-0x4

它不是生成线程,而是进行矢量化。

这可能是另一个好问题,为什么矢量化与

std::execution::par
一起应用。

这里推荐阅读的内容可能包括本文

© www.soinside.com 2019 - 2024. All rights reserved.