您使用哪些并行编程API?

时间:2008-10-03 13:04:48

标签: multithreading pthreads parallel-processing openmp

考虑到当今多核和多处理硬件的巨大重要性,试图了解当前人们如何实际编写并行代码。对我来说,看起来主流范式是pthreads(POSIX线程),它在Linux上是原生的,可在Windows上使用。 HPC人员倾向于使用OpenMP或MPI,但似乎StackOverflow上没有这些。或者你依靠Java线程,Windows线程API等而不是便携式标准?在您看来,建议的并行编程方式是什么?

或者你正在使用更多异国情调的东西,如Erlang,CUDA,RapidMind,CodePlay,Oz,甚至是亲爱的老奥卡姆?

澄清:我正在寻找可移植的解决方案,适用于各种主机架构上的Linux,各种unix等平台。 Windows是一种罕见的案例,非常适合支持。所以C#和.net在这里真的太狭隘,CLR是一个很酷的技术,但是他们可以为Linux主机发布它,这样它就像JVM,Python,Erlang或任何其他可移植语言一样普遍。

基于C ++或JVM:可能是C ++,因为JVM往往会隐藏性能。

MPI:我同意甚至HPC人员都认为它是一种难以使用的工具 - 但是对于在128000处理器上运行,它是解决map / reduce不适用的问题的唯一可扩展解决方案。但是,消息传递非常优雅,因为它是唯一可以很好地扩展到本地内存/ AMP,共享内存/ SMP,分布式运行时环境的编程风格。

一个有趣的新竞争者是MCAPI。但我认为没有人有时间对此有任何实际经验。

总的来说,情况似乎是有许多我不了解的有趣的Microsoft项目,而且Windows API或pthreads是实践中最常见的实现。

20 个答案:

答案 0 :(得分:10)

MPI并不像大多数人看起来那么难。现在我认为多范式方法最适合并行和分布式应用程序。使用MPI进行节点到节点的通信和同步,使用OpenMP或PThread进行更精细的并行化。想想每台机器的MPI,以及每个核心的OpenMP或PThreads。这似乎比在不久的将来为每个核心产生新的MPI Proc更好一些。

现在可能对于双核或四核,为机器上的每个核心生成一个proc将不会有那么多的开销,但是随着我们在每台机器上接近越来越多的核心,其中缓存和内存不会缩放同样,使用共享内存模型更合适。

答案 1 :(得分:6)

我建议OpenMP。 Microsoft已将其放入Visual C ++ 2005编译器中,因此它得到了很好的支持,除了使用/ omp指令进行编译之外,您不需要做任何事情。

它的使用简单,但显然它并不能为你做任何事情,但事实并非如此。我使用它来运行并行循环通常没有任何麻烦,对于更复杂的事情我倾向于自己滚动(例如我有很久以前的代码我剪切,粘贴和修改)。

您可以尝试Cilk++看起来不错,并且有一本电子书"How to Survive the Multicore Software Revolution"

这两种系统都试图并行化串行代码 - 即采用for循环,以尽可能简单的方式同时在所有内核上运行它。它们通常不是通用线程库。 (例如,一个research paper(pdf)描述了在openMP中实现的不同类型的线程池的性能,并建议添加2个新的操作 - yield和sleep。我认为他们错过了一点点的OpenMP )

正如您提到的OpenMP,我假设您在谈论本机c ++,而不是C#或.NET。

此外,如果HPC人员(我认为他们是这类领域的专家)似乎正在使用OpenMP或MPI,那么这就是你应该使用的,而不是SO的读者群!

答案 2 :(得分:4)

我们已经开始关注微软的parallel extensions - 它尚未发布,但肯定显示出潜力。

答案 3 :(得分:3)

我使用ACE允许开发人员在任何平台上使用POSIX(或windows)样式线程。

答案 4 :(得分:2)

Parallel FX Library (PFX) - 由Microsoft Research与Microsoft的CLR团队合作开发的托管并发库,用于包含.NET Framework的未来版本。它由两部分组成:并行LINQ(PLINQ)和任务并行库(TPL)。它还包含一组协调数据结构(CDS) - 一组用于同步和协调并发任务执行的数据结构。该图书馆于2007年11月29日作为CTP发布,并于2007年12月和2008年6月再次刷新。

虽然没有太多经验......

答案 5 :(得分:2)

请注意,此处的答案不会成为“实际使用”的统计代表性答案。我已经看到了许多“X很好”的答案。

我个人在很多项目中都使用过Windows Threads。我见过的其他API广泛使用的是pthreads。在HPC方面,MPI仍然受到使用它的人的认真对待<subjective>我没有 - 它将C ++的所有优雅与Javascript的性能结合在一起。它幸存下来,因为没有合适的选择。它将失去一方的高度耦合的NUMA机器和另一方面的Google风格的map-reduce。 </subjective>

答案 6 :(得分:2)

更多Data Parallel Haskell会很好,但即使没有它,GHC&gt; 6.6也能通过Control.Parallel .Strategies轻松并行化算法。

答案 7 :(得分:1)

Open CL怎么样?

答案 8 :(得分:1)

我编写的大多数并发程序都在Ada中,它完全支持该语言本身的并行性。其中一个很好的好处是你的并行代码可以移植到任何带有Ada编译器的系统。不需要特殊的图书馆。

答案 9 :(得分:1)

在很大程度上取决于您的环境。

对于老C来说,没有什么胜过POSIX。

对于C ++,BOOST.ORG中有一个非常好的线程库是免费的。

Java只使用本机java线程。

您还可以查看其他方法来实现除线程之外的并行性,例如将应用程序划分为客户端和服务器进程以及使用异步消息传递进行通信。如果做得恰当,这可以在数十台服务器上扩展到数千名用户。

还值得重新考虑的是,如果您使用的是Windows MFC,Gnome或Qt窗口环境,那么您将自动处于多线程环境中。如果您使用的是Apache ISS或J2EE,则您的应用程序已在多线程多进程环境中运行。

答案 10 :(得分:1)

对于.Net,我已经非常成功地使用了RetLang。对于JVM,Scale很棒。

答案 11 :(得分:0)

我维护一个并发链接博客,随着时间的推移已经覆盖了很多这些博客(并将继续这样做):

http://concurrency.tumblr.com

答案 12 :(得分:0)

到目前为止我只知道Java,多线程支持对我有用..

答案 13 :(得分:0)

PLINQ

+1

Win32线程,线程池和光纤,同步对象

答案 14 :(得分:0)

我使用OpenMP很多,主要是因为它的简单性,便携性和灵活性。它支持多种语言甚至是全能的C ++ / Cli :)

答案 15 :(得分:0)

我使用MPI并非常喜欢它。它确实会让你想到内存层次结构,但根据我的经验,考虑这些事情对于高性能来说非常重要。在许多情况下,MPI可以主要隐藏在特定于域的并行对象(例如用于求解线性和非线性方程的PETSc)之后。

答案 16 :(得分:0)

pycuda ...没有像25000活动线程一样:) [warp预定与记分板]。 cuda 2有流支持,所以我不确定会带来什么样的流。 CUDA Matlab扩展看起来很整洁,PLUTO以及麻省理工学院即将推出的PetaBricks也是如此。

就其他人而言,缺乏python的线程; MPI等很复杂,我没有集群,但我认为它们实现了它们的构建;在我开始公寓之前我停止了c#编程(可能是一件好事)。

答案 17 :(得分:0)

它本身不是 parallel ,并且没有分布式模型,但您可以使用Clojure在JVM上编写高度并发的代码。随后您将获得大量可用的Java库。你必须在clojure之上实现你自己的并行算法,但这应该相对容易。我重复一遍,尚未拥有分布式模型。

答案 18 :(得分:0)

来自glibc库http://library.gnome.org/devel/glib/stable/glib-Threads.html的gthreads编译成pthreads,所以你不会失去任何性能。它们还为线程池提供了非常强大的线程池和消息队列。我已多次成功使用它们,并对可用功能非常满意。

答案 19 :(得分:0)

我使用open cl。我认为与mpi相比它更容易使用。我之前也使用mpi作为我的并行和分布式计算课程的要求,但我认为你必须做太多的手工劳动。我是几天后就开始在CUDA工作.CUDA与open cl非常相似,但问题是CUDA仅适用于nvidia产品。