首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以在C++11中安全地使用OpenMP吗?

我可以在C++11中安全地使用OpenMP吗?
EN

Stack Overflow用户
提问于 2012-12-12 18:28:23
回答 5查看 10.2K关注 0票数 44

OpenMP标准只考虑ISO98( C++ 14882:1998)。这意味着在C++03甚至C++11下没有支持OpenMP用法的标准。因此,任何使用C++ >98和OpenMP的程序都在标准之外运行,这意味着即使它在某些条件下工作,它也不太可能是可移植的,但绝对不能保证。

对于具有自己的多线程支持的C++11,情况甚至更糟,这很可能会在某些实现中与OpenMP发生冲突。

那么,在C++03和C++11中使用OpenMP有多安全呢?

可以在同一个程序中安全地使用C++11多线程和OpenMP,但不会交错(即在任何传递给C++11并发特性的代码中没有OpenMP语句,在OpenMP产生的线程中也没有C++11并发)?

我特别感兴趣的情况是,我首先使用OpenMP调用一些代码,然后在相同的数据结构上使用C++11并发调用其他代码。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-12 20:24:12

沃尔特,我相信我不仅告诉了你that other discussion的现状,而且还直接从源代码(也就是我的同事,他是OpenMP语言委员会的成员)为你提供了信息。

OpenMP被设计为FORTRAN语言和C语言的轻量级数据并行添加,后来扩展到C++习惯用法(例如,随机访问迭代器上的并行循环),并通过引入显式任务来实现任务并行。它的目的是在尽可能多的平台上具有可移植性,并在所有三种语言中提供基本上相同的功能。它的执行模型非常简单-单线程应用程序在并行区域中派生线程团队,在其中运行一些计算任务,然后将团队加入到串行执行中。如果启用了嵌套并行,则并行组中的每个线程稍后都可以派生自己的组。

由于OpenMP的主要用途是在高性能计算中(毕竟,它的指令和执行模型是从High Performance Fortran中借用的),所以任何OpenMP实现的主要目标都是效率,而不是与其他线程范例的互操作性。在某些平台上,只有当OpenMP运行时是唯一控制进程线程的运行时时,才能实现有效的实现。此外,OpenMP的某些方面可能不能很好地与其他线程构造配合使用,例如,在派生两个或更多并发并行区域时,OMP_THREAD_LIMIT设置的线程数量限制。

由于OpenMP标准本身并不严格禁止使用其他线程范型,但也没有对它们的互操作性进行标准化,因此支持此类功能取决于实现者。这意味着一些实现可能会提供顶级OpenMP区域的安全并发执行,而另一些可能不会。x86实施者承诺支持它,可能是因为他们中的大多数也是其他执行模型的支持者(例如,英特尔与Cilk和TBB,GCC与C++11等)。x86通常被认为是一个“实验”平台(其他供应商通常更为保守)。

ISO4.0在C++特性方面也没有比OpenMP /IEC1998:14882更进一步( SC12草案是here)。该标准现在包括诸如可移植线程亲和性之类的东西-这肯定不能与其他线程范例很好地配合,这些范例可能提供自己的绑定机制,与OpenMP的绑定机制冲突。同样,OpenMP语言的目标是高性能计算(数据和任务并行的科学和工程应用程序)。C++11构造的目标是通用计算应用程序。如果您想要奇特的C++11并发功能,那么只使用C++11,或者如果您真的需要将它与OpenMP混合使用,那么如果您想保持可移植性,那么就坚持使用语言特性的C++98子集。

我特别感兴趣的情况是,我首先使用OpenMP调用一些代码,然后在相同的数据结构上使用C++11并发调用其他代码。

没有什么明显的原因是您不希望实现的,但这取决于您的OpenMP编译器和运行时。有使用OpenMP进行并行执行的免费库和商业库(例如MKL),但总是有警告(尽管有时隐藏在他们的用户手册中)可能与多线程代码不兼容,这些多线程代码给出了什么是可能的以及何时可能的信息。一如既往,这超出了OpenMP标准的范围,因此超出了YMMV的范围。

票数 28
EN

Stack Overflow用户

发布于 2012-12-13 17:27:06

我实际上对高性能计算很感兴趣,但是OpenMP (目前)不能很好地满足我的目的:它不够灵活(我的算法不是基于循环的)

也许你真的在找TBB?它在标准C++中提供了对循环和基于任务的并行以及各种并行数据结构的支持,并且是可移植的和开源的。

(完整免责声明:我为英特尔工作,他们与TBB密切相关,尽管我实际上并不是在 TBB上工作,而是在OpenMP上工作:-);我肯定不是在为英特尔发言!)

票数 7
EN

Stack Overflow用户

发布于 2012-12-18 02:06:10

像Jim Cownie一样,我也是英特尔的员工。我同意他的观点,英特尔线程构建模块(Intel TBB)可能是一个很好的选择,因为它具有循环级并行(如OpenMP ),但也具有其他并行算法、并发容器和低级功能。而TBB试图跟上当前的C++标准。

为了让沃尔特明白,Intel TBB包括parallel_reduce算法以及对原子和互斥锁的高级支持。

您可以在http://software.intel.com/sites/products/documentation/doclib/tbb_sa/help/tbb_userguide/title.htm上找到英特尔®线程构建模块的用户指南。该用户指南概述了库中的功能。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13837696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档