han*_*nno 44 optimization multithreading pthreads openmp
在共享内存并行化方面,大多数科学计算人员使用OpenMP作为准标准.
是否有任何理由(除了可读性)使用OpenMP而不是pthreads?后者似乎更基本,我怀疑它可以更快更容易优化.
Mik*_*ike 41
它基本上归结为您希望对并行化的控制级别.如果您只想添加一些#pragma语句并快速拥有代码的并行版本,那么OpenMP非常棒.如果你想用MIMD编码或复杂的排队做一些非常有趣的事情,你仍然可以使用OpenMP完成所有这些工作,但在这种情况下使用线程可能要简单得多.OpenMP在可移植性方面也有类似的优势,因为不同平台的许多编译器现在都支持它,就像pthreads一样.
所以你绝对正确 - 如果你需要对你的并行化进行微调控制,请使用pthreads.如果要以尽可能少的工作进行并行化,请使用OpenMP.
无论你决定去哪里,祝你好运!
Vla*_*zan 23
另一个原因:OpenMP是基于任务的,Pthreads是基于线程的.这意味着OpenMP将分配与核心数相同数量的线程.所以你将获得可扩展的解决方案 使用原始线程来完成它并不是一件容易的事.
第二种观点:OpenMP提供了缩减功能:当您需要在线程中计算部分结果并将它们组合在一起时.您可以使用单行代码实现它.但是使用原始线程你应该做更多的工作.
只需考虑您的要求并尝试理解:OpenMP足够适合您吗?你会节省很多时间.
小智 8
OpenMP需要一个支持它的编译器,并使用编译指示.这样做的好处是,在没有OpenMP支持的情况下进行编译时(例如,现在的PCC或Clang/LLVM),代码仍然可以编译.另外,看看Charles Leiserson写的关于DIY多线程的内容.
Pthreads是用于库的POSIX标准(IEEE POSIX 1003.1c),而OpenMP规范将在编译器上实现; 话虽如此,有各种pthread实现(例如OpenBSD rthreads,NPTL),以及许多支持OpenMP的编译器(例如带有-fopenmp标志的GCC,MSVC++ 2008).
Pthread仅在多个处理器可用时才有效并行,并且仅在代码针对可用处理器数量进行优化时才有效.因此,OpenMP代码更容易扩展.您可以将使用pthreads编译的代码与使用pthreads的代码混合在一起.