我试图使用C ++ 17标准中提出的新并行库功能,但我无法使其工作。我尝试使用最新版本的g++ 8.1.1
和clang++-6.0
以及-std=c++17
进行编译,但似乎都不支持#include <execution>
,std::execution::par
或任何类似的东西。
声称,当查看cppreference的并行算法时,会有很多算法列表
技术规范提供了来自
algorithm
,numeric
和memory
的以下69种算法的并行化版本:( ...长列表...)
听起来像算法已经准备好'在纸上',但尚未准备好使用?
在this SO question一年多前,答案声称这些功能尚未实施。但到现在为止,我希望看到某种实现方式。有什么我们可以使用的吗?
您可以参考https://en.cppreference.com/w/cpp/compiler_support来检查所有C++
功能实现状态。对于你的情况,只搜索“Standardization of Parallelism TS
”,你会发现只有MSVC
和Intel C++
编译器现在支持这个功能。
GCC 9将拥有它们
在https://gcc.gnu.org/gcc-9/changes.html提到
并行算法和(需要线程构建块2018或更新)。
当它获得发布标签时,我会试一试。我想知道“螺纹构建模块2018”将需要什么。
Gcc还没有实现Parallelism TS(参见https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2017)
然而,libstdc ++(带有gcc)具有一些等效并行算法的实验模式。见https://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html
让它工作:
任何并行功能的使用都需要额外的编译器和运行时支持,特别是对OpenMP的支持。添加此支持并不困难:只需使用编译器标志-fopenmp编译应用程序即可。这将链接到libgomp,GNU卸载和多处理运行时库,其存在是必需的。
代码示例
#include <vector>
#include <parallel/algorithm>
int main()
{
std::vector<int> v(100);
// ...
// Explicitly force a call to parallel sort.
__gnu_parallel::sort(v.begin(), v.end());
return 0;
}