16

考虑到当今多核和多处理硬件的巨大重要性,试图了解人们目前实际上是如何编写并行代码的。对我来说,主要的范式似乎是 pthreads(POSIX 线程),它在 Linux 上是原生的,在 Windows 上可用。HPC 人倾向于使用 OpenMP 或 MPI,但在 StackOverflow 上似乎没有很多。还是您依赖 Java 线程、Windows 线程 API 等而不是可移植标准?在您看来,进行并行编程的推荐方法是什么?

或者您是否在使用更奇特的东西,例如 Erlang、CUDA、RapidMind、CodePlay、Oz,甚至亲爱的老 Occam?

澄清:我正在寻找非常便携且适用于各种主机架构上的平台(例如 Linux、各种 unix)的解决方案。Windows 是一种极少的支持很好的案例。所以 C# 和 .net 在这里真的太狭窄了,CLR 是一项很酷的技术,但他们能否为 Linux 主机发布它,以便它像 JVM、Python、Erlang 或任何其他可移植语言一样普遍。

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

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

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

所以总的来说,情况似乎是有很多我不知道的有趣的微软项目,而 Windows API 或 pthreads 是实践中最常见的实现。

4

20 回答 20

10

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

也许对于现在的双核或四核来说,为机器上的每个内核生成一个 proc 不会有那么多开销,但是随着我们接近每台机器越来越多的内核,而缓存和芯片内存没有那么多扩展,使用共享内存模型会更合适。

于 2008-11-21T14:42:36.310 回答
6

我会推荐OpenMP。Microsoft 已将其放入 Visual C++ 2005 编译器中,因此它得到了很好的支持,除了使用 /omp 指令进行编译外,您无需执行任何操作。

它使用简单,但显然它并不能为您做所有事情,但什么也做不了。我使用它来运行并行循环,通常没有任何麻烦,对于更复杂的事情我倾向于自己滚动(例如,我有很多年前的代码,我剪切、粘贴和修改)。

你可以试试Cilk++,它看起来不错,并且有一本电子书“如何在多核软件革命中生存”

这两种系统都试图并行化串行代码 - 即采用 for 循环以尽可能简单的方式同时在所有内核上运行它。它们往往不是通用线程库。(例如,一篇研究论文(pdf) 描述了在 openMP 中实现的不同类型线程池的性能,并建议应该向其中添加 2 个新操作——yield 和 sleep。我认为他们在那里有点遗漏了 OpenMP 的意义)

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

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

于 2008-10-03T13:42:03.973 回答
4

我们已经开始研究 Microsoft 的并行扩展- 它尚未发布,但肯定显示出潜力。

于 2008-10-03T13:08:18.673 回答
3

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

于 2008-10-03T13:10:39.650 回答
2

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

虽然没有太多经验...

于 2008-10-03T13:16:10.607 回答
2

更多数据并行 Haskell会很好,但即使没有它,GHC>6.6 也有一些令人印象深刻的能力,可以通过Control.Parallel .Strategies轻松并行化算法。

于 2008-10-05T01:37:52.840 回答
2

请注意,这里的答案不会是“实际使用”的统计代表性答案。我已经看到许多“X 很好”的答案。

我个人在许多项目中都使用过 Windows 线程。我见过的另一个广泛使用的 API 是 pthreads。在 HPC 方面,MPI 仍然受到使用它的人的重视,但<subjective>我没有——它结合了 C++ 的所有优雅和 Javascript 的性能。它之所以存在,是因为没有像样的选择。一方面它会输给紧密耦合的 NUMA 机器,另一方面会输给 Google 风格的 map-reduce。</subjective>

于 2008-10-03T14:45:02.440 回答
1

开放 CL怎么样?

于 2008-12-19T09:15:22.203 回答
1

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

对于佩林老 C,没有什么比 POSIX 更好的了。

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

Java 只使用本机 Java 线程。

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

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

于 2008-12-19T09:27:39.010 回答
1

对于 .Net,我使用RetLang取得了巨大成功。对于 JVM,Scale很棒。

于 2008-10-03T13:31:00.297 回答
1

我编写的大多数并发程序都是在Ada中编写的,它完全支持该语言的原生并行性。这样做的好处之一是您的并行代码可以移植到任何带有 Ada 编译器的系统。不需要特殊的库。

于 2009-03-18T15:06:51.977 回答
0

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

http://concurrency.tumblr.com

于 2008-10-05T02:19:10.870 回答
0

pycuda ......没有什么比 25000 个活动线程 :) [warp 计划与记分板]。cuda 2 支持流,所以我不确定 streamit 会带来什么。CUDA Matlab 扩展看起来很整洁,PLUTO和来自 MIT 的即将到来的 PetaBricks 也是如此。

至于其他人,python的线程是缺乏的;MPI 等很复杂,我没有集群,但我想它们实现了它们的目的;在进入线程公寓之前,我停止了 c# 编程(可能是件好事)。

于 2009-04-09T07:31:32.140 回答
0

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

于 2009-04-09T07:37:39.130 回答
0

glibc 库http://library.gnome.org/devel/glib/stable/glib-Threads.html中的 gthreads编译为 pthreads,因此您不会失去任何性能。它们还为您提供了非常强大的线程池和线程之间的消息队列。我已经成功使用了好几次,并且对可用的功能非常满意。

于 2009-04-30T16:39:29.593 回答
0

我经常使用 OpenMP 主要是因为它的简单性、可移植性和灵活性。它支持多种语言,甚至是全能的 C++/Cli :)

于 2009-02-27T17:16:36.433 回答
0

到目前为止我只知道 Java,那里的多线程支持对我来说效果很好..

于 2008-12-19T09:24:27.940 回答
0

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

于 2013-04-04T06:13:04.697 回答
0

+1 为 PLINQ

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

于 2008-10-03T14:47:42.810 回答
0

我使用 MPI 并且非常喜欢它。它确实迫使您考虑内存层次结构,但根据我的经验,考虑这些事情对于高性能仍然很重要。在许多情况下,MPI 可以在很大程度上隐藏在特定领域的并行对象后面(例如,用于求解线性和非线性方程的 PETSc)。

于 2009-03-18T14:58:28.970 回答