应该何时使用OpenMP库?

pas*_*ena 3 c++ openmp

据我所知,OpenMP是一个标准,也是一个在C++代码中实现多线程的库.

Visual C++已经有Windows的线程API,UNIX有POSIX线程.我没有说明为什么需要它,或者在哪种情况下适用于OpenMP.

编辑:与使用CreateThread或其他POSIX函数(假设类似的代码是parellilized)相比,OpenMP是否也提高了性能?

Oli*_*rth 8

系统线程API(例如POSIX线程)要求您手动完成大量工作(设置线程,在线程之间拆分工作,完成时同步,拆除线程等).很多代码膨胀,模糊了你真正想要做的事情.而且容易出错.又乏味.和平台有关.

OpenMP为您完成所有这些.在我看来,它最适合数据并行 ; 在许多情况下,它就像#pragma ompfor循环之前放置一个指令一样简单,并且该循环将自动多线程.但它也可以用于任务并行.

OpenMP并不能提高性能,因为总是可以编写至少与OpenMP版本一样的手动线程代码.但是,通常情况下,OpenMP将获得90%以上的理论最佳性能,并且需要5分钟的编码工作量(假设您首先以线程友好的方式编写了循环).

我推荐阅读维基百科的文章,以获得一些很好的例子.