我正在为科学计算社区开发代码,特别是迭代地求解线性方程组(Ax = b形式)。
我已经将BLAS和LAPACK用于原始矩阵子程序,但我现在意识到手动并行化有一定的余地。我正在开发一个共享内存系统,它有两个选择:OpenMP和PThreads。
假设时间不是最大的因素(和代码的性能),这是一个更好的,未来的证明,也许,可移植(到CUDA)并行化的方式?花在使用Pthreads上花费的时间是否值得提升?
我相信我的应用程序(基本上处理一次启动许多事情,然后根据所有这些事项的“最佳”值进行操作),将受益于显式线程控制,但我担心编码会占用太多时间,最后不会有绩效回报。
我已经在这里看过几个类似的问题,但它们都与一般应用有关。
This关于Linux中的通用多线程应用程序。
This也是一个普遍的问题。
我知道SciComp.SE,但觉得这里的主题更多。
答案 0 :(得分:7)
您的问题看起来好像您希望OpenMP的编码效率高于Pthreads,Pthreads的执行效率高于OpenMP。总的来说,我认为你是对的。然而,不久前我决定我的时间比计算机的时间更重要,并选择了OpenMP。这不是我有理由后悔的决定,也不是我有任何确凿证据可以证实的决定。
但是你认为你的选择仅限于OpenMP和Pthreads是错误的,MPI(我假设你至少听说过这个,如果没有再发布的话)也会在共享内存机器上运行。对于某些应用程序,可以对MPI进行编程,使其在共享内存计算机上的性能不会太高。
三年(+/-几年)科学开发人员工具箱中的基本并行化工具是OpenMP和MPI。使用这些工具的任何人都是大型用户社区的一部分,比Pthreads和MPI的用户社区更大(仅仅是轶事证据)。今天,随着GPU和其他加速器逐渐涌现,情况更加分散,很难从HMPP,ACC,Chapel,MPI-3,OpenMP4,CUDA,OpenCL等中选出一名获胜者。我仍然认为OpenMP + MPI是一个有用的组合,但不能忽视块上的新孩子。
FWIW我致力于开发用于地球物理应用的计算EM代码,因此非常核心的“科学计算”。
答案 1 :(得分:2)
我意识到我的答案很长,所以我先把结论作为不耐烦的人:
简答:
我会说openMP和pthreads基本相同,你应该选择最少的开发时间给你(如果它符合你的需要,可能是openMP)。但是如果你想投入开发时间,也许你应该重新设计你的代码,以便它可以适应其他范例(例如矢量化以利用SSE / AVX或GPU)。
<强>开发:强>
如果你开发线性求解器,我假设你的代码将(非常)长寿(即它可能会比将使用它的物理模型更长)。在这种情况下,特别是如果您没有大型开发团队,我认为您的选择主要取决于开发时间,可维护性和
另外,你不应该认为今天的“最佳”选择(无论“最佳”可能意味着什么)明天可能仍然不是“最佳”选择。所以,即使你现在面临着 openMP vs pthreads 问题(现在甚至频谱已经超过@ HighPerformanceMark答案中所说的那个),你应该期望有更多选择来自在将来。
如果您现在有开发时间,那么我会说,如果您可以在代码中抽象所有计算密集型内核,以便您可以轻松地将它们适应不同的并行化范例,那么投资会更好。在这方面,最重要(也是最困难)的事情是数据结构:从GPGPU计算的合并中受益,需要将数据放在与传统缓存优化方式不同的顺序中。
这导致我得出结论:所有基于线程的解决方案基本上是等效的(在性能和代码架构方面),您应该选择需要最少开发时间的解决方案。但是如果你想投入开发时间,也许你应该重新设计你的代码,以便它可以并行化或矢量化(从而利用SSE / AVX或GPU)。如果您设法做到这一点,您将能够遵循硬件/软件演进并保持性能。
答案 2 :(得分:1)
要添加已经很好的答案:OpenMP通常比我编写pthreads时更好地并行化代码。鉴于OpenMP也更容易,如果这些是我的选择,我总是选择它。我怀疑如果你问这个问题你不是一个pthread大师,所以我也建议使用OpenMP而不是pthreads。