【发布时间】:2020-12-21 15:50:31
【问题描述】:
这个 C++17 sn-p 在新版本的 G++ 中运行良好
std::for_each(std::execution::par_unseq, container.begin(), container.end(), [&](const auto& element) {
// do something with element... or don't. whatever.
});
当您尝试将该代码移植到当前的 Debian(稳定)发行版(例如,该发行版具有 G++ 8.3.0(截至 2020 年 12 月))时,您会发现自己正在阅读以下错误消息:
fatal error: execution: File not found
#include <execution>
^~~~~~~~~~~
依赖于涉及宏的__has_include 的明显解决方案是:
#if __has_include(<execution>)
#include <execution>
#define PAR_UNSEQ std::execution::par_unseq,
#else
#define PAR_UNSEQ
#endif
std::for_each(PAR_UNSEQ container.begin(), container.end(), [&](const auto& element) {
// do something with element... or don't. whatever.
});
这编译得很好,但在我看来有两个主要问题:
- 对于没有
<execution>标头和的系统而言,它不是并行的 - 那个宏不是我喜欢看的东西。
那么有没有更好的办法呢?
或者如果没有,至少有一个宏解决方案实际上可以并行for_each?
【问题讨论】:
-
在
for_each()的情况下,您可以使用 OpenMP 并行 for 循环。 -
@Shawn 从未尝试过 OpenMP,因为 STL 已经具有该功能,至少我是这么认为的。与其他答案相比,这有什么优点/缺点吗?
-
它受到编译器的广泛支持并且相当可移植,不像 C++17 并行
for_each()(我怀疑)至少再过 5 年,如果不是更长的话。