【发布时间】:2012-11-30 00:50:57
【问题描述】:
OpenMP 标准仅考虑 C++ 98 (ISO/IEC 14882:1998)。这意味着在 C++03 甚至 C++11 下没有标准支持 OpenMP 的使用。因此,任何使用 C++ >98 和 OpenMP 的程序都在标准之外运行,这意味着即使它在某些条件下工作,它也不太可能是可移植的,但绝对不能保证。
C++11 自带多线程支持,情况更糟,在某些实现中很可能会与 OpenMP 发生冲突。
那么,在 C++03 和 C++11 中使用 OpenMP 有多安全?
可以在同一个程序中安全地使用 C++11 多线程和 OpenMP,但不将它们交错(即在传递给 C++11 并发特性的任何代码中都没有 OpenMP 语句,也没有 C++11 OpenMP 产生的线程中的并发性)?
我对首先使用 OpenMP 调用一些代码,然后在相同数据结构上使用 C++11 并发调用一些其他代码的情况特别感兴趣。
【问题讨论】:
-
是的,是的,是的,一千次是的!与语言集成不佳的可怕,可怕的预处理器黑客,请死! (免责声明,我已经在 OpenMP 之上编写了一个库,并且我已经写了一篇关于此的硕士论文;我至少表面上知道我在咆哮什么。)
-
是的,但不是因为你写的原因;相反,我会问什么基础设施实际上支持这个标准?如果您正在寻找执行大规模并行计算,我会寻找可以在云计算平台上完成的事情(即使不是在 C++ 中);如果您必须构建自己的集群才能使用 OpenMP,那是不值得的。
-
@MichaelAaronSafyan 我显然只是在谈论多线程,而不是分布式计算。如果你想这样,你必须完全使用其他东西。
-
问题标题有点煽情。也许重命名为“我怎样才能安全地使用 OpenMP?”并让人们决定是否放弃它。
-
除非标题中的“应该放弃”位被删掉,否则我将投票结束这个不具建设性的内容。