作为来自企业Web开发领域的HPC领域的一员,我一直很想知道如何回到“真实世界”的开发人员正在利用并行计算。 现在所有的芯片都是多核的,这更加重要,当芯片上有成千上万个核心而不是几个核心时,它将更加相关。
我的问题是:
这对您的软件路线图有何影响? 我特别感兴趣的是关于多核如何影响不同软件领域的真实故事,因此请说明您在答案中做了什么样的开发(例如服务器端,客户端应用程序,科学计算等)。 您现有的代码如何利用多核机器,以及您面临的挑战是什么? 你使用的是OpenMP,Erlang,Haskell,CUDA,TBB,UPC还是其他的东西? 随着并发水平的不断提高,你打算做什么?以及如何处理数百或数千个内核? 如果你的域不容易从并行计算中获益,那么解释为什么它也很有趣。 最后,我将它定义为多核问题,但可以随意谈论其他类型的并行计算。 如果您正在移植部分应用程序以使用MapReduce,或者如果大型群集上的MPI是您的范例,那么您也一定要提及这一点。
更新:如果您的答案是#5,请提及您是否认为如果需要更多内核(100,1000等)时,事情会发生变化,您可以使用可用的内存带宽(请参阅每个内核带宽越来越小)。 你仍然可以为你的应用程序使用剩余的核心吗?
我的研究工作包括编译器和垃圾邮件过滤。 我也做了很多'个人生产力'Unix的东西。 另外,我编写和使用软件来管理我教授的课程,其中包括评分,测试学生代码,跟踪成绩和其他各种琐事。
除了作为编译器支持其他应用程序的研究问题之外, 多核并不影响我 。 但是这些问题主要在于运行时系统,而不是编译器。 Dave Wortman大约在1990年左右表示,您可以并行编译器来保持四个处理器的繁忙 。 没有人知道我曾经重复过这个实验。 大多数编译器足够快,可以运行单线程。 并行运行顺序编译器在多个不同的源文件上运行比使编译器本身并行更容易。 对于垃圾邮件过滤, 学习本身就是一个连续的过程 。 即使是一台较旧的机器也可以每秒学习数百条消息,因此即使在一分钟内也可以学习大型语料库。 再次, 培训足够快 。 我使用并行机器的唯一重要方式是使用并行make 。 这是一个很大的好处,而大的构建很容易并行化 。 Make几乎可以自动完成所有工作。 我唯一能记住的另一件事是使用并行性来把时间长的学生代码放到一堆实验室机器上,我可以很好地做到这一点,因为我只是在每台机器上都打碎了一个内核,所以只用1 / 4个CPU资源。 噢,我写了一个Lua脚本,它会在使用蹩脚文件翻录MP3文件时使用所有4个内核。 这个脚本是很多工作来获得正确的。 我将忽略数十,数百和数千个核心 。 我第一次被告知“并行机器即将到来;你必须准备好”是1984年。当时的确如此,现在的确如此, 并行编程是高技能专家的领域 。 唯一改变的是,今天制造商迫使我们支付并行硬件,无论我们是否愿意。 但仅仅因为硬件付费并不意味着它可以免费使用。 编程模型非常糟糕,并且使线程/互斥模型工作,更不用说表现良好,即使硬件是免费的,也是一项昂贵的工作。 我希望大多数程序员忽略并行性,并悄然开展业务。 当一位熟练的专家带着平行制作或电脑游戏时,我会默默地鼓掌并利用他们的努力。 如果我想为自己的应用程序提供性能,我会专注于减少内存分配并忽略并行性。 并行性真的很难。 大多数域很难并行化。 像并行制作这样的广泛可重用的例外是令人欣喜的原因。 总结(我从一位为一家领先的CPU制造商工作的主题演讲者那里听到):业界支持多核,因为他们无法让机器运行得更快更热,而且他们不知道如何处理额外的晶体管。 现在他们迫切希望找到一种让多核赢利的方法,因为如果他们没有利润,他们就无法建造下一代的晶圆厂生产线。 肉汁火车已经结束,我们可能不得不开始关注软件成本。
许多认真对待并行的人忽视了这些玩具四核甚至32核的机器,而支持128或更多处理器的GPU。 我的猜测是,真正的行动将在那里。
对于Web应用程序来说非常非常简单:忽略它。 除非你有一些真正需要并行执行的代码,否则你可以简单地编写旧式的单线程代码并且很开心。
与核心相比,您在任何特定时刻通常都有更多的请求需要处理。 而且由于每一个都是在它自己的Thread中处理的(甚至是根据你的技术进行处理),这已经在并行工作。
唯一需要注意的地方是访问某种需要同步的全局状态。 尽量避免在其他(几乎)完美可扩展的世界中引入人为瓶颈。
所以对于我来说,多核心基本上归结为这些项目:
我的服务器有更少的“CPU”,而每个服务器运行更多的核心(对我来说差别不大) 相同数量的CPU可以承担更多的并发用户 如果性能瓶颈似乎不是CPU被100%加载的结果,那么这表明我在某个地方做了一些不好的同步。
目前 - 并没有太大的影响,说实话。 我更多地处于“准备阶段”,了解使这成为可能的技术和语言功能。 我没有一个特定的域,但是我遇到了像数学这样的领域(其中多核心是必不可少的),数据排序/搜索(在多核心上的分而治之是有用的)和多计算机要求(例如,要求某个备用站的处理能力用于某物)。 这取决于我在工作的语言。 很显然,在C#中,我的双手与并行扩展的尚未准备好的实现捆绑在一起,这似乎提高了性能,直到您开始将相同的算法与OpenMP进行比较(可能不是一个公平的比较)。 所以在.NET上,它将是一个轻松的搭配,有一些for
→ Parallel.For
重构等等。
事情真正有趣的地方在于C ++,因为与.NET相比,您可以从OpenMP等东西中获得的性能惊人。 实际上,OpenMP让我很吃惊,因为我没有想到它能够如此高效地工作。 那么,我想它的开发者有很多时间去打磨它。 我也很喜欢它可以在Visual Studio中使用,不像TBB,您必须付费。
至于MPI,我使用PureMPI.net作为小型家庭项目(我有一个局域网)来欺骗一台机器无法完成的计算。 我从来没有使用过MPI,但我知道MKL有一些MPI优化的功能,对于需要它们的人来说可能很有趣。 我打算做'轻率计算',即使用额外的内核来预先计算可能需要或可能不需要的结果 - 当然RAM允许。 我也打算深入研究大多数最终用户的机器现在无法处理的昂贵的算法和方法。 至于没有从平行化中受益的领域......好吧,总能找到一些东西。 有一两件事, 我关心的是在.NET体面的支持,但遗憾的是我已经放弃希望,速度类似于C ++可以实现。
链接地址:
http://www.djcxy.com/p/79309.html
上一篇:
How are you taking advantage of Multicore?
下一篇:
Threading vs Parallelism, how do they differ?