MultiCore架构的出现是否会影响我作为软件开发人员?

时间:2009-02-19 22:29:59

标签: cpu multicore paradigms

作为一个主要处理高级编程语言的软件开发人员,我不确定我能做些什么来适当关注即将到来的多核计算机的全方位存在。我写的主要是普通和非要求的应用程序,但我认为重要的是要知道我是否需要改变任何编程范例甚至语言来掌握未来。

我的问题是:
How to deal with increasing multicore presence in day-by-day hacking?

11 个答案:

答案 0 :(得分:7)

答案 1 :(得分:4)

大多数问题不需要大量的CPU时间。实际上,单核足够快,可用于多种用途。当您发现程序太慢时,首先对其进行概要分析,然后查看您选择的算法,体系结构和缓存。如果这样做不够,请尝试将问题分解为单独的进程。通常,这对于故障隔离而言非常值得做,因此您可以了解每个进程的CPU和内存使用情况。此外,通常每个进程都将在特定核心上运行并充分利用处理器缓存,因此您不必承受保持缓存行一致的大量性能开销。如果你进行多进程设计并且仍然发现问题需要比你拥有的机器更多的CPU时间,那么你可以很好地扩展它在集群上运行。

在某些情况下,您需要在同一地址空间内使用多个线程,但要注意线程确实很难正确。竞争条件,特别是在非安全语言中,有时需要数周才能调试;通常,只需在调试器下添加跟踪或运行,就会改变时间,足以隐藏问题。简单地将锁定放在任何地方通常意味着您会获得大量的锁定开销,有时会出现如此多的锁争用,以至于您并没有真正获得您希望的并发优势。即使你已经正确锁定,你也需要进行配置以调整缓存一致性。最后,如果你想真正调整一些高度并发的代码,你可能最终会看到无锁构造和比当前多线程库中更复杂的锁定方案。

答案 2 :(得分:3)

了解并发的好处和限制(例如Amdahl定律)。

因此,在可能的情况下,您可以利用唯一可以实现更高性能的路线。在更简单的方法(期货和任务库)上发生了许多创新工作,并且重新发现了旧工作(函数语言和不可变数据)。

免费午餐结束了,但这并不意味着没有什么可以利用的。

答案 3 :(得分:2)

一般来说,使用线程变得非常友好。这是一种可怕的并行化机制,但它就是我们所拥有的。

如果您使用.NET,请查看Parallel Extensions。它们允许您轻松完成许多并行编程任务。

答案 4 :(得分:2)

要从更多只有一个核心中受益,您应该考虑并行化代码。多个线程,不可变类型和最少的同步是你的新朋友。

答案 5 :(得分:2)

我认为这将取决于您正在撰写的应用程序类型。

某些类型的应用程序更多地受益于它们运行在多核CPU上然后运行其他应用程序。 如果您的应用程序可以从多核事实中受益,那么您应该准备好并行。 免费午餐结束了;也就是说:在过去,当一个新的cpu发布时你的应用程序变得更快,你不必为你的应用程序付出任何努力来获得额外的速度。 现在,要利用多核cpu提供的功能,您必须确保应用程序可以利用它。那就是:你要看看哪些任务可以多线程/并发执行,这会给表带来一些问题......

答案 6 :(得分:2)

了解Erlang / F#(取决于您的平台)

答案 7 :(得分:2)

  • 首选不可变数据结构,它们的使用使得软件不仅在并发程序中更容易理解。

  • 了解使用您的语言进行并发的工具(例如java.util.concurrent,JCIP)。

  • 学习一种功能语言(例如Haskell)。

答案 8 :(得分:0)

我被问到同样的问题,答案是“这取决于”。如果你的Joe Winforms,也许不是那么多。如果您的编写代码必须具有高性能,是的。我可以通过并行编程看到的最大问题之一就是:如果某些东西不能平行,并且你撒谎并告诉运行时并行执行,它不会崩溃,它只是会做错的事情,你会得到废话结果,并责怪框架。

答案 9 :(得分:0)

了解C和C ++代码的OpenMP和MPI。

OpenMP也适用于其他语言,就像我想的Fortran一样。

答案 10 :(得分:0)

编写较小的程序。

其他代码语言/样式可以让你更好地进行多线程处理(虽然多线程在任何语言中都很难)但是常规开发人员恕我直言的最大好处是能够同时执行大量小程序来完成更大的任务任务。

因此,养成将问题分解为可以随时运行的独立组件的习惯。

您也可以构建更易于维护的软件。