C++ 并发与并行——特别是在C++;

C++ 并发与并行——特别是在C++;,c++,concurrency,parallel-processing,c++-standard-library,C++,Concurrency,Parallel Processing,C++ Standard Library,我理解两者之间的基本区别,我经常在我的程序中使用std::async,这给了我并发性 有没有可靠的/显著的库可以提供C++中的并行性?(我知道这可能是C++17的一个特性)。如果是,你对他们有什么经验 谢谢! Barbra 线程构建块()是一个模板化的C++任务并行库。该库包含各种专门用于任务并行性的算法和数据结构。我已经成功地使用了parallel_for以及parallel_管道来大大加快计算速度。通过一点额外的编码,TBB的parallel_for可以接受一个适合并行执行的串行for循环,

我理解两者之间的基本区别,我经常在我的程序中使用std::async,这给了我并发性

有没有可靠的/显著的库可以提供C++中的并行性?(我知道这可能是C++17的一个特性)。如果是,你对他们有什么经验

谢谢! Barbra

线程构建块()是一个模板化的C++任务并行库。该库包含各种专门用于任务并行性的算法和数据结构。我已经成功地使用了parallel_for以及parallel_管道来大大加快计算速度。通过一点额外的编码,TBB的parallel_for可以接受一个适合并行执行的串行for循环,并使其如此执行(参见示例)。TBB的并行_管道能够执行一系列相关任务,每个任务可以并行或串行执行(参见示例)。在web上有更多的示例,尤其是在stackoverflow()上

OpenMP是一种线程并行API,主要通过编译器指令访问。尽管我更喜欢使用TBB提供的更丰富的功能集,但OpenMP可以作为测试并行算法和代码的快速方法(只需添加一个pragma并设置一些构建设置)。一旦事情经过测试和实验,我发现将OpenMP的某些用途转换为TBB相当容易。这并不是说OpenMP不适用于严肃的编码。事实上,在某些情况下,人们可能更喜欢OpenMP而不是TBB(一个原因是,由于OpenMP主要依赖于pragmas,因此切换到串行执行可能比TBB更容易)。许多利用OpenMP的开源项目都可以在这里找到。OpenMP的web上有许多示例(例如)和教程,其中包括有关stackoverflow的许多问题

我以前忽略了关于(单指令,多数据)的讨论,它提供了数据并行性。正如以下评论中指出的,OpenMP是探索SIMD的一个选项(请选中此项)。对指令集的扩展,如and(x86指令集体系结构的扩展)和ARM体系结构,也值得探索。我有使用SSE和AVX的好的和坏的经验。好的方面是,它们可以为某些算法提供很好的加速(特别是我使用的)。糟糕的是,使用这些指令的能力取决于特定的CPU支持,这可能会导致意外的运行时异常


特别是在并行性和数学方面,我有很好的经验使用(现在有一个)以及。这些库提供常用数学函数/例程(例如和)的优化、并行和/或矢量化实现。还有更多的库专门处理数学问题,在某种程度上涉及优化的并行性。虽然它们可能无法提供较低级别的并行构建块(例如,操作线程、调度任务的能力),但利用(并促进)计算数学领域的大量研究和工作是非常值得的。对于数学以外的感兴趣的领域也可以说是类似的说法

库现在有很多并行版本,但这些版本是否提供有意义的优势取决于您对实现的选择。@KerrekSB哪个编译器实际实现了算法的并行版本?OpenMP不仅仅是测试并行算法的玩具。此外,我认为有必要指出,TBB基于任务并行,OpenMP基于线程并行(它也有SIMD功能,但主要用于线程并行)。@Zboson,我更新了我的回答,以反映对OpenMP更中立的立场,并纳入您的评论。撇开我对TBB的偏好不谈,OpenMP是一个非常有价值的工具。我间接使用它作为OpenCV和英特尔MKL的一部分。我不知道OpenMP的SIMD功能。我添加了一个关于SIMD的简短段落,因为它涉及到数据并行性。