什么时候应该使用OpenMP库
When should the OpenMP library be used?
据我所知,OpenMP是在c++代码中实现多线程的标准,也是一个库。
Visual c++已经为Windows提供了线程api, UNIX也有POSIX线程。我不明白为什么需要它,或者在哪种情况下适用于使用OpenMP。
编辑:是否OpenMP也提高了性能,与使用CreateThread或其他POSIX函数相比(假设类似的代码被并行化)?
系统线程api(如POSIX线程)要求您手动执行大量工作(设置线程、在线程之间划分工作、在线程完成时进行同步、关闭线程等)。大量的代码膨胀掩盖了您真正想要做的事情。而且容易出错。和乏味。平台相关。
OpenMP为您完成了所有这些。在我看来,它最适合数据并行性;在许多情况下,它就像在for
循环之前放一个#pragma omp
指令一样简单,并且该循环将自动多线程。但它也可以用于任务并行性。
OpenMP并没有提高性能,因为总是有可能编写至少与OpenMP版本一样出色的手动线程代码。但通常情况下,OpenMP可以让您获得90%以上的理论最佳性能,只需5分钟的编码工作(假设您首先以线程友好的方式编写循环)。
我推荐阅读维基百科的文章来获得一些好的例子。
例如,当您尝试编写可移植代码时。OpenMP在windows和unix系统上都可以工作。而且,在大多数情况下,它比操作线程要容易得多。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 什么时候在C++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 您应该在什么时候创建自己的异常类型
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 什么时候可以使用常量装饰调用我的重载函数?
- unordered_map什么时候返回 -1?
- QCoreApplication什么时候有效?
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 什么时候用指针调用C++类构造函数
- 我不明白在这个例子中什么时候调用构造函数
- 如果真的需要std::move,我们应该什么时候声明右值refs
- P1008("prohibit aggregates with user-declared constructors")在实践中什么时候有用?
- 程序什么时候会创建多个堆
- 调用boost.asio的异步函数时,线程是什么时候创建的
- Swig/python : 什么时候需要 SWIG_init() ?
- 什么时候应该使用OpenMP库