Concurrency 从并行编程开始

Concurrency 从并行编程开始,concurrency,parallel-processing,cuda,fft,opencl,Concurrency,Parallel Processing,Cuda,Fft,Opencl,因此,看起来多核及其所有相关的复杂问题将继续存在。我正在计划一个软件项目,它肯定会从并行性中受益。问题是我几乎没有编写并发软件的经验。我在大学里学习过它,很好地理解了它的概念和理论,但从学校开始就没有在多处理器上运行的软件构建方面的有用经验 所以我的问题是,开始多处理器编程的最佳方式是什么? 我主要熟悉C/C++中的Linux开发和Mac OS X上的Obj-C,几乎没有Windows经验。此外,我计划的软件项目将需要FFT,可能需要对大量数据进行浮点比较 有OpenCL、OpenMP、MPI、

因此,看起来多核及其所有相关的复杂问题将继续存在。我正在计划一个软件项目,它肯定会从并行性中受益。问题是我几乎没有编写并发软件的经验。我在大学里学习过它,很好地理解了它的概念和理论,但从学校开始就没有在多处理器上运行的软件构建方面的有用经验

所以我的问题是,开始多处理器编程的最佳方式是什么? 我主要熟悉C/C++中的Linux开发和Mac OS X上的Obj-C,几乎没有Windows经验。此外,我计划的软件项目将需要FFT,可能需要对大量数据进行浮点比较

有OpenCL、OpenMP、MPI、POSIX线程等。。。我应该从什么技术开始

以下是我正在考虑的几个堆栈选项,但不确定它们是否能让我尝试实现我的目标:

  • 我应该找雪豹,试着 获取要运行的OpenCL Obj-C程序 在我的电脑上的ATI X1600 GPU上执行 笔记本电脑?或
  • 我应该买一个吗 Playstation并尝试将C代码写入 它有六个可用的单元SPE核心? 或
  • 我应该构建一个Linux机器吗 使用Nvidia卡并尝试工作 和库达在一起

提前感谢您的帮助。

您应该这样做。非常好。

如果你对OSX的并行性感兴趣,一定要去看看,特别是因为这项技术已经开源,很快就会被广泛采用。

你不需要像图形卡和单元这样的特殊硬件来做并行编程。简单的多核CPU也将从并行编程中获益。如果您有使用C/C++和objective-C的经验,请从其中一个开始,学习使用线程。从简单的例子开始,比如矩阵乘法或迷宫求解,你将了解到这些讨厌的问题(并行软件是不确定的,充满了海森堡)


如果你想进入大规模的多重并行,我会选择openCL,因为它是最便携的。Cuda仍然有一个更大的社区,更多的文档和示例,而且更容易一些,但你需要一张nvidia卡。

我建议你先使用OpenMP和MPI,不确定你先选择哪一个很重要,但你肯定应该(在我看来:-)学习并行计算的共享内存和分布式内存方法

我建议首先避免使用OpenCL、CUDA和POSIX线程:在开始处理子结构之前,先对并行应用程序的基础知识有一个良好的了解。例如,学习在MPI中使用广播通信要比在线程中编程容易得多

我会坚持在你的Mac电脑上使用C/C++,因为你已经熟悉了它们,而且有很好的开源OpenMP和MPI库用于该平台和这些语言

而且,对于我们中的一些人来说,这是一个巨大的优势,无论你学习了C/C++和MPI(OpenMP也在较小程度上是如此),当你毕业于真正的超级计算机时,都将为你提供很好的服务


所有这些都是主观的和有争议的,所以如果你愿意,请忽略这一点。

传统的命令式“带锁共享状态”不是你唯一的选择。Rich Hickey是JVM的Lisp 1 Clojure的创建者,他对共享状态提出了一个非常有说服力的论点。他基本上认为几乎不可能做到正确。您可能需要阅读传递消息的ala Erlang actors或STM库

也许你的问题适合这个范例。它自动处理负载平衡和并发问题,谷歌的研究论文已经是经典。您有一个名为Mars的单机实现,它运行在gpu上,这对您来说可能很好。Phoenix还可以在多核和对称多处理器上运行map reduce。

在学习如何处理分布式内存时,我将从MPI开始。是一款老掉牙但很不错的产品,MPI在OSX上开箱即用,现在提供了相当好的多核性能

你知道GCD是否允许我在X1600 GPU上运行FFT吗?在这种情况下,你想看看OpenCL,而不是GCD。GCD是针对CPU的,OpenCL是针对GPU的。我认为CUDA可能是我最好的选择,因为社区更加发达,Nvidia似乎致力于HPC,而且。。。它是C和Linux。我仍然不知道GPU是否能够运行FFT之类的东西,或者这个问题是否有意义!FFT很有意义。例如,请参见Hi Mark,您是否有一些链接可以发送给我,让我开始使用OpenMP和MPI-Talesh-Talesh在Windows下安装VS2010或2012,启动它,转到F#interactive并键入
Array.map(+)3)[1..10 |]
。你写了一个系列的F#程序。然后键入
Array.Parallel.map(+)3][1..10][/code>。你正在进行并行编程。