考虑到当今多核和多处理硬件的巨大重要性,试图掌握当前人们实际编写并行代码的方式.对我来说,看起来主流范式是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.但我认为没有人有时间对此有任何实际经验.
总的来说,情况似乎是有许多我不了解的有趣的微软项目,而且Windows API或pthreads是实践中最常见的实现.
MPI并不像大多数人看起来那么难.现在我认为多范式方法最适合并行和分布式应用程序.使用MPI进行节点到节点的通信和同步,使用OpenMP或PThread进行更精细的并行化.想想每台机器的MPI,以及每个核心的OpenMP或PThreads.这似乎比在不久的将来为每个核心产生新的MPI Proc更好一些.
也许现在对于双核或四核,为机器上的每个核生成一个proc将不会有那么多开销,但是当我们接近每台机器上越来越多的核时,缓存和内存不会扩展那么多,使用共享内存模型会更合适.
我推荐OpenMP.Microsoft已将其放入Visual C++ 2005编译器中,因此它得到了很好的支持,除了使用/ omp指令进行编译之外,您不需要执行任何操作.
它的使用简单,但显然它并不能为你做任何事情,但事实并非如此.我使用它来运行并行循环通常没有任何麻烦,对于更复杂的事情我倾向于自己滚动(例如我有很久以前的代码我剪切,粘贴和修改).
您可以尝试看起来不错的Cilk ++,并且有一本电子书"如何生存多核软件革命".
这两种系统都尝试并行化串行代码 - 即采用for循环,以尽可能简单的方式同时在所有内核上运行它.它们通常不是通用线程库.(例如,一篇研究论文(pdf)描述了在openMP中实现的不同类型的线程池的性能,并建议添加2个新操作 - yield和sleep.我认为他们在那里忽略了一点OpenMP
正如您提到的OpenMP,我假设您在谈论本机c ++,而不是C#或.NET.
此外,如果HPC人员(我认为他们是这类领域的专家)似乎正在使用OpenMP或MPI,那么这就是你应该使用的,而不是SO的读者群!