我理解两者之间的基本区别,我经常在程序中使用std :: async,这给了我并发性。
是否有可靠/值得注意的库可以在C ++中提供并行性? (我知道这可能是C ++的一个特色17)。如果是这样,你对他们有什么经历?
谢谢! 芭芭拉
答案 0 :(得分:5)
线程构建块(TBB)是一个用于任务并行的模板化C ++库。该库包含专门用于任务并行的各种算法和数据结构。我使用parallel_for和parallel_pipeline成功地大大加快了计算速度。通过一些额外的编码,TBB的parallel_for可以采用适合并行执行的串行for循环,并使其执行(参见示例here)。 TBB的parallel_pipeline能够执行一系列相关任务,每个任务都可以并行或串行执行(参见示例here)。网络上有更多的例子,特别是software.intel.com和stackoverflow(see here)。
OpenMP是一种用于线程并行的API,主要通过编译器指令访问。虽然,我更喜欢使用TBB提供的更丰富的功能集,但OpenMP可以快速测试并行算法和代码(只需添加一个编译指示并设置一些构建设置)。一旦经过测试和实验,我发现将OpenMP的某些用途转换为TBB可以相当容易地完成。这并不是说OpenMP不适用于严肃的编码。实际上,可能存在一种情况,其中人们更喜欢OpenMP而不是TBB(一种是因为它主要依赖于编译指示,切换到串行执行可能比使用TBB更容易。)。可以在此discussion中找到许多使用OpenMP的开源项目。有关OpenMP的Web上有许多示例(例如,on wikipedia)和教程,其中包含有关stackoverflow的许多问题。
我之前忽略了对SIMD(单指令,多数据)的讨论,它提供了数据并行性。正如下面的评论所指出的,OpenMP是一个探索SIMD的选项(请查看此link)。对SSE和AVX(x86指令集架构的扩展)以及NEON(ARM架构)等指令集的扩展也值得探讨。我在使用SSE和AVX方面有过良好的经验。好处是它们可以为某些算法提供很好的速度(特别是我使用过Intel intrinsics)。不好的是,使用这些指令的能力取决于特定的CPU支持,这可能会导致意外的运行时异常。
特别是在并行性和数学方面,我使用Intel MKL(现在有no cost option)以及OpenBLAS获得了很好的体验。这些库提供常见数学函数/例程的优化,并行和/或矢量化实现(例如,BLAS和LAPACK)。还有更多的库可以专门处理那些在某种程度上涉及优化并行性的数学。虽然它们可能不提供较低级别的并行性构建块(例如,操纵线程的能力,安排任务),但是在计算数学领域中利用(并促成)大量的研究和工作是非常有价值的。对于数学以外的兴趣领域,可以说类似的陈述。