为什么 std::execution::p ar_unseq 不起作用?

Why std::execution::par_unseq doesn't work?

提问人:R.Post 提问时间:11/11/2023 最后编辑:R.Post 更新时间:11/11/2023 访问量:53

问:

以下代码无法并行运行的原因可能是什么?

#include <iostream>
#include <execution>
#include <unistd.h>

int main() {
    std::vector<int> parts(10);
    std::iota(parts.begin(), parts.end(), 0);

    std::for_each(std::execution::par_unseq,
                  parts.begin(), parts.end(), [&](int part) {
        usleep(1'000'000);
        std::cout << part << std::endl;
    });

    return 0;
}

这是在AMD上运行的Linux Debian,代码由以下命令编译

g++ -std=c++17 -fopenmp -O2 -o test test.cpp

代码应在大约 1 秒内输出数字 0..9。现在大约需要 10 秒,因为代码不并行运行。

顺便说一句。usleep() 函数可以用其他一些计算繁重的函数代替,但它不会改变这种情况。

编辑:

我做了“sudo apt install libtbb-dev”,然后用 -ltbb 编译,它必须是编译命令中的最新参数,否则它不起作用。问题解决了。谢谢Lyngmo@Ted!

并行处理 C++17 G++

评论

0赞 Ted Lyngmo 11/11/2023
不适合作为答案:在您的机器上安装英特尔 oneAPI(线程构建模块 - 简称 TBB)可能会有所帮助。然后,在编译时-ltbb
0赞 R.Post 11/11/2023
这是AMD cpu,在这种情况下是否无关紧要?
0赞 Ted Lyngmo 11/11/2023
我没有注意到。我在 Intel 和 AMD 上都使用过 TBB
0赞 R.Post 11/11/2023
好的,谢谢你的想法。我也要试试。
0赞 Ted Lyngmo 11/11/2023
别客气!如果实现能够使用它,安装 TBB 可能会有所帮助。然而,你的问题的答案在我下面的回答中,你的实现实际上可能无法使用 TBB 或任何其他后端来实际执行你所期望的。

答:

0赞 Ted Lyngmo 11/11/2023 #1

并行执行策略描述了允许的并行性类型。

如果未实现并行执行策略,则允许实现回退到顺序执行策略,这似乎是您的情况。就实现细节而言,它在头文件中可能如下所示:

#ifdef __has_some_parallel_backend
use_parallel_backend(first, last);
#else
use_sequential_fallback(first, last);
#endif

某些实现可以有条件地使用这些并行策略,具体取决于已安装的其他包。

评论

0赞 R.Post 11/11/2023
“如果没有实现并行”是什么意思?
0赞 Ted Lyngmo 11/11/2023
@R.Post 许多实现依赖于并行执行部分的其他实现。如果未集成任何策略,则实现将回退到顺序策略。