提问人:R.Post 提问时间:11/11/2023 最后编辑:R.Post 更新时间:11/11/2023 访问量:53
为什么 std::execution::p ar_unseq 不起作用?
Why std::execution::par_unseq doesn't work?
问:
以下代码无法并行运行的原因可能是什么?
#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!
答:
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 许多实现依赖于并行执行部分的其他实现。如果未集成任何策略,则实现将回退到顺序策略。
评论
-ltbb