所以它看起来像多核,所有相关的复杂功能都存在。我正在计划一个肯定会受益于并行性的软件项目。问题是我编写并发软件的经验很少。我在大学学习并很好地理解了这些概念和理论,但是从学校开始就没有掌握在多个处理器上运行软件的有用经验。
所以我的问题是,开始使用多处理器编程的最佳方法是什么? 我熟悉C / C ++中的Linux开发和Mac OS X上的Obj-C,几乎没有Windows经验。此外,我计划的软件项目将需要FFT,并且可能需要对大量数据进行浮点比较。
有OpenCL,OpenMP,MPI,POSIX线程等......我应该从哪些技术开始?
以下是我正在考虑的几个堆栈选项,但不确定他们是否会让我尝试实现我的目标:
提前感谢您的帮助。
答案 0 :(得分:4)
我建议最初使用OpenMP和MPI,不确定它首先选择哪个,但你肯定应该(在我看来:-))学习并行计算的共享和分布式内存方法。
我建议首先避免使用OpenCL,CUDA和POSIX线程:在开始与子结构搏斗之前,先了解并行应用程序的基础知识。例如,学习在MPI中使用广播通信比在线程中编程它们要容易得多。
我已经在Mac上坚持使用C / C ++,因为您已经熟悉它们,并且有适合该平台和那些语言的开源OpenMP和MPI库。
并且,对于我们中的一些人来说,这是一个很大的优势,无论你学到什么关于C / C ++和MPI(在较小的程度上,它也适用于OpenMP),当你毕业于真正的超级计算机时,它将为你提供良好的服务。
所有主观和议论,如果你愿意,请忽略这一点。
答案 1 :(得分:3)
如果您对OS X中的并行性感兴趣,请务必查看Grand Central Dispatch,特别是因为该技术已经开源并可能很快会被广泛采用。
答案 2 :(得分:3)
传统和命令式的“锁定共享状态”不是您唯一的选择。 Rich Hickey是Clojure的创建者,是JVM的Lisp 1,它对共享状态提出了非常有说服力的论据。他基本上认为,几乎不可能做对。您可能想要阅读传递ala Erlang actor或STM库的消息。
答案 3 :(得分:2)
你应该Learn You Some Erlang。非常好。
答案 4 :(得分:2)
您不需要像图形卡和单元格这样的特殊硬件来进行并行编程。您的简单多核CPU也将从并行编程中获益。如果您有使用C / C ++和objective-c的经验,请从其中一个开始并学习使用线程。从矩阵乘法或迷宫求解等简单示例开始,您将了解那些讨厌的问题(并行软件是非确定性的并且充满了Heisenbugs)。
如果你想进入大规模的多平行主义,我会选择openCL,因为它是最便携的。 Cuda仍然有一个更大的社区,更多的文档和示例,并且更容易,但你是一张nvidia卡。
答案 5 :(得分:0)
也许您的问题适合MapReduce范例。它自动处理负载平衡和并发问题,谷歌的研究论文已经是经典之作。你有一个名为Mars的单机实现在GPU上运行,这可能对你有用。还有Phoenix在多核和对称多处理器上运行map-reduce。
答案 6 :(得分:0)
当你学习如何处理分布式内存时,我会从MPI开始。 Pacheco's book是一个老人但是好东西,MPI在OS X上开箱即用,现在提供了相当不错的多核性能。