你关心多核吗?

时间:2009-02-12 22:26:52

标签: multicore

这是不可否认的:多核计算机将继续存在。

这就是:高效的多核编程非常困难。这不仅仅是了解pthreads的情况。

这是有争议的:“街头的开发者”需要关注他/她自己的这些发展。

您在多大程度上担心必须扩展多核技能?您正在编写的软件是并行化的候选者,如果是,您是否正在做任何教育自己的事情(如果您还不知道这些技术)?或者您是否认为操作系统会处理大部分操作系统,语言运行时会尽力而为,您的应用程序将很乐意坐在一个核心上并让其他人做他们的事情?

20 个答案:

答案 0 :(得分:27)

你的程序通常是CPU绑定的吗?

如果没有,请忘掉它。它与您无关,并且在不向您提出任何要求的情况下为您的用户提供更流畅的体验。

很酷,嗯?

如果您受CPU限制,并且您的问题可以并行化,那么您可以利用多个核心。现在是开始担心它的时候了。


来自评论:

  

改善答案的建议:给出粗略的解释   如何判断您的程序是否受CPU限制。 - Earwicker

CPU绑定意味着阻止程序运行得更快的事情是缺乏计算能力。与 IO绑定(或有时网络绑定)进行比较。主板和处理器选择不当可导致机器内存绑定(是的,我正在看,alpha)。

所以你需要知道你的程序在做什么(不知道机器有多忙......)要找到类似unix的系统运行top。在Windows上使用taskmanager(感谢Roboprog)。

在每个核心负载小于1的计算机上(例如,当您没有做任何事情时,您的桌面计算机),CPU绑定过程将始终拥有超过50%的处理器(通常超过90%) )。当负载平均值高于该值时(即,您有三个编译,SETI @ home和后台运行的两个对等网络),CPU绑定进程将具有(# of cores)/(load average)的很大一部分。

答案 1 :(得分:21)

请注意:如果您的应用程序具有GUI并且进行了大量计算,请始终在单独的线程上进行强烈的计算。忘记这样做就是为什么GUI会冻结。

答案 2 :(得分:12)

我不同意目前接受的答案。

多核机器最重要的方面是 CPU和主内存相距甚远。这意味着除非应用程序“令人尴尬地并行”或易于并行化,否则很可能是内存绑定而不是CPU绑定。 浮点乘法大约需要4个时钟周期,而从主存储器中取出的存储器需要数百个时钟周期。因此,利用缓存局部性变得很重要。

对于难以并行化的应用程序,如果在单核上实现的性能足够(大多数应用程序属于此类),则无需并行化。但如果不是(或者你的竞争对手的应用程序因并行化而响应更快),那么你最好重构你的应用程序以更好地利用并行性和缓存局部性。模糊地说,重构的应用程序将由相对独立(或通信较少)的子模块组成,这些子模块并行运行(参见this example)。

请参阅http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-183.html,详细了解多核以及事物的发展方向。他们说的主要观点是:

  • 时钟速度不再像以前那样增加。与少量快速处理器相比,制造更多更慢,更简单的内核更具成本效益。
  • 内存(越来越远)远离CPU
  • 几年后,Web服务器中将有 1000个核心,桌面上将有100个核心。因此,计划将您的应用程序(可能是自动扩展)扩展到100或1000个核心。这意味着您应该创建几个独立的任务。
  • 线程难以使用,因此更好地处理“任务”

答案 3 :(得分:8)

这是开始学习函数式语言的一个很好的论据,这些函数语言更容易针对并行执行进行优化。

答案 4 :(得分:6)

我认为这通常值得关注,温和地说。

几乎不需要说过去几十年来CPU速度的大幅提升非常有价值,而且进一步的收益也同样有价值。

但是,从现在开始,这些收益主要包括核心数量的定期增加。因此,要从这些收益中获益,软件需要可并行化。

许多应用程序的许多计算密集型部分实际上是用SQL编写的,因此它们已经可以运行并且能够被RDBMS分解为并行任务。所以那些人可以放松一下。

但是我们这些人主要用C#写作,即使我们正在编写GUI,我们也需要密切关注这些东西。 GUI经常必须对它呈现给用户的任何模型执行一些有用的操作,并且当用户必须坐下并等待它完成时,用户会感到烦恼。几年后他们会更加恼火,当他们看到任务管理器时,他们看到大约3%的新型32核机器正在被使用。

答案 5 :(得分:6)

是的,我也一直在使用线程进行编程。但是,我并没有足够的自虐来爱他们。无论你是多么超级男人,加上你从同事那里得到的任何帮助,在线程之间进行交谈仍然太容易了。线程很容易做,但很难做到正确,所以当然Joe-Schmoe很喜欢它,而且,它们很快! (当然,这一切都很重要)

在* nix上,好的旧fork()仍然是很好的方法。开销并不算太糟糕(是的,我需要在某天测量它以备份我的BS),特别是如果你要求翻译,然后在子进程中生成一堆任务特定的数据。

也就是说,据说,在Windoze上,儿童流程非常昂贵。所以Erlang的方法看起来相当不错:强迫Joe Schmoe编写纯函数并使用消息传递而不是他看似无限状态的自动机全局(实例)变量whack-fest与奖励线程交叉谈话盛会。

但我并不痛苦: - )

修订/评论:

其他地方关于距离记忆的优秀评论。最近我也一直在考虑这个问题。标记和清除垃圾收集确实会损害运行进程的“局部性”方面。旧的80286上的M / S GC on 0等待状态RAM似乎无害,但它在多级缓存架构上确实很痛。在某些情况下,引用count + fork / exit可能不像GC实现那么糟糕吗?


编辑:我付出了一些努力来支持我的演讲(结果各不相同): http://roboprogs.com/devel/2009.04.html

答案 6 :(得分:4)

我认为可能发生的事情是,一旦大量核心(比如8+)变得普遍,那么我们将看到利用并行性的应用程序的开发,这在单线程世界中被认为是不可行的。

我无法想到具体的例子,但考虑一下3D加速器变得普遍时会发生什么。当时的游戏(想想毁灭战士)受到软件渲染代码速度的限制。具有高度详细的3D模型,甚至没有考虑模拟反射/折射和每像素照明。现在每个人都这样做。

因此,除非您当前的应用程序受到高度CPU限制,否则我不会担心它们的并行化。如果您发现通过多个内核拥有大量CPU功率,那么请考虑在新项目中利用它的方法。

答案 7 :(得分:4)

我认为这是一个很好的问题。所以,我已经开始发布一系列博客文章 here

Dmckee的答案在最狭隘的意义上是正确的。让我在这里用自己的话来改写,隐含地包括一些评论:

  

并行化没有价值   不受CPU限制的操作。   并行化没什么价值   仅受CPU限制的操作   短时间,比如说,不到   几百毫秒。确实,   这样做最有可能导致   程序更复杂,越野车。   学习如何实现细粒度   并行性是复杂的   这很难。

就目前而言,这是事实,但我相信,对于更广泛的计划,答案更为丰富。实际上,在生产应用程序中使用多线程,然后隐式多核技术有很多原因。例如,用户可以从用户界面线程移动磁盘和网络I / O操作,这对您的用户来说是一个巨大的好处。

这与增加计算绑定操作的吞吐量无关,而且与保持程序的用户界面响应有关。注意,这里不需要图形用户界面 - 命令行程序,服务和基于服务器的应用程序也可以从中受益。

我完全同意采用CPU绑定操作并使其瘫痪通常是一项复杂的任务 - 需要细粒度同步,CPU缓存,CPU指令管道等知识。事实上,这可能是经典的“硬”。

但是,我认为做他的需要是罕见的;没有那么多问题需要这种细粒度的并行性。是!它们确实存在并且每天都可以解决这个问题,但我认为在大多数开发人员的日常生活中,这种情况非常罕见。

即便如此,还是有充分的理由学习多线程和多核开发的基础知识。

  1. 通过将更长的操作移出消息循环线程,它可以使您的程序从用户角度更具响应性。
  2. 即使对于没有CPU限制的东西,通常也可以并行执行。
  3. 它可以将复杂的单线程状态机分解为更简单,更程序化的代码。
  4. 事实上,操作系统已经为您做了很多工作,您可以使用支持多核的库(如Intel's stuff)。但是,操作系统和库并不神奇 - 我认为大多数开发人员学习多线程编程的基础知识是很有价值的。这将让您编写更好的软件,让您的用户更满意。

    当然,并非每个程序都应该是多线程的,或者是多核的。一些东西以简单的单线程方式实现就好了。因此,不要将此视为每个程序应该是多线程的建议 - 在此处使用您自己的良好判断。但是,它通常是一种有价值的技术,并且在许多方面非常有益。如上所述,我计划在博客上稍微开始here。随意跟随并在那里发表评论

答案 8 :(得分:3)

没办法!我是Clojure程序员! :d

答案 9 :(得分:2)

我并不担心。这些概念并不太难,更多的开发人员编写多线程应用程序=关于这个主题的更多材料=更容易弄清楚你需要什么。

答案 10 :(得分:2)

我认为,对于大多数程序员和应用程序而言,重要多核并不比标准多线程开发具有显着的优势或潜力。大多数人都有线程来完成顺序作业,并且将这些线程分成更小的单元的可能性并不大。

恕我直言,重要多核的大多数好处都来自对底层框架的改进(例如,数据库访问,IO,GUI和3D工具包等),并且绝大多数开发人员都会透明地受益。

此外,未来的静态分析工具可能会推荐可以进一步拆分为线程的部分。

答案 11 :(得分:2)

我已经使用线程编程超过15年了。我丝毫不担心

答案 12 :(得分:1)

好吧,既然我在ASP.Net中进行了Web开发,那么我可以看到多个领域的多核发挥作用:

1)客户端。如果有人想要在运行诸如排序长数据列表之类的东西时利用四核CPU的客户端,那么如何针对Javascript这样的东西进行优化。胖客户是否会使用新版本的IE,Firefox,Safari和Chrome?

2)Web服务器上的服务器端。在IIS和它使用的.Net框架中,PLINQ之类的东西如何帮助使用并行或并发编程来帮助加快处理请求?可以使用哪些IIS设置来增强性能并将其调整到硬件?

3)中间件/ DB后端。最新的MS-SQL Server或Oracle或MySQL如何使用多核和多插槽的附加资源来处理,例如:如果一个四插槽主板在每个插槽中都有四核CPU,并且顶部有超线程,那么有32个线程可以同时运行,这与当时的单个核心CPU完全不同。

此外,对于GPU的多核方面有一些话要说,其中Crossfire和SLI是开始但现在有更多的混合图形解决方案,人们可​​能想知道将来如何利用它,例如AMD的融合是一个想法,我不确定它会做得多好,但它是我听到的最后一次。

关于教育自己的主题,我不确定在某些情况下优化我的代码会有多大帮助。我更感兴趣的是IIS如何在它之前尝试利用新的计算领域,因为这最终会限制一些可以完成的事情,即使我将我的代码隔离在自己的小世界中运行。

这些只是我目前的想法,随时都可能发生变化。

答案 13 :(得分:0)

没有。我觉得多核将在某些编程领域产生重大影响,但几乎不会影响其他领域。过了一会儿它所做的区域会吸收它并将其封装起来,炒作几乎不会触及其他区域。

答案 14 :(得分:0)

我对多核编程没有太多考虑,但它总是在我的眼前。

我在并行处理方面遇到的最大问题是确定应该并行化的内容?分离线程到后台处理文件很容易,但文件处理本身可以并行化吗?

我认为可以并且应该并行化的问题可以通过复杂的架构决策来解决,这些决策是在应用程序的一般已经复杂的架构决策之上分层的。我的信念是,这种复杂性将通过操作系统或编程语言来解决。在C及其后代中找到的传统并行化线程模型并不是最终的答案。

答案 15 :(得分:0)

我一直在考虑的是,大多数分而治之的算法并不是可以大规模并行化的吗?每个拆分应该能够在两个单独的线程中运行......

无论如何,当我需要关注时,我很担心。当我的程序开始变慢时,我会寻找加快速度的方法。不幸的是,这个在我的工作中是个问题。

答案 16 :(得分:0)

Dataflow programming显示了对多核问题的相对简单解决方案的一些承诺。

正如维基百科所说,它需要一个相当重要的范式转换,这似乎阻止了编程社区的轻松采用。

答案 17 :(得分:0)

作为一名独立游戏开发者,我其实非常兴奋。在活跃的时刻,有几款游戏受到CPU限制。几乎所有现代3D游戏都对硬件非常负担。多年来,多核一直是视频领域的法律。现在有一些nvidia卡有超过200个核心。

为这些卡片编写着色器是一种乐趣,我迫不及待地想看看越来越多的机器是多进程的。

我认为这种需求会随着时间的推移产生更好的线程支持。我们仍然有疯狂的方案,如apach MPM-Worker模型,你可以同时获得多个进程和线程的混合。我希望看到更好地采用像绿线一样的东西,它们似乎都在同一个进程中,但实际上是分布在核心上的。但是,当然有人必须在共享内存方面有一些突破性的想法才能解决这个问题。

近期:除非你破坏你的处理器,否则这不是什么大问题 长期:最好用锁来舒服:)

答案 18 :(得分:0)

我的一位以硬件为导向的教授告诉我们(好的,讲道),这是一个非常重要的计算机科学领域。更重要的是,它将由操作系统解决(我注意到Apple正在强大,MS可能也是如此),或者编码器本身需要考虑并行执行(线程等等)。 / p>

相当整齐的CS区域。 :)

答案 19 :(得分:0)

不,我并不担心。

我的工作有点不寻常,并且可能比平均水平更容易并行,但无论我认为它更多是机会而不是问题。

部分我迫不及待想要达到真正值得为多核优化的事情。我不知道目前确切的数字是什么,但看起来我们的客户有一半是单核机器,49%有双核,可能有1%有四核。这意味着多线程在大多数情况下并没有真正带来巨大的性能提升,因此并不值得花费太多时间。

在几年的时间内,当平均值可能是四核时,在智能多线程代码上花费一些时间会有更多的情况 - 我认为这对我们的开发人员来说是一件好事。我们所需要的只是让英特尔和AMD快点做出更多......: - )