代码之家  ›  专栏  ›  技术社区  ›  Chathuranga Chandrasekara

多核处理器编程

  •  15
  • Chathuranga Chandrasekara  · 技术社区  · 15 年前

    据我所知,处理器中的多核架构不会影响程序。实际的指令执行是在较低的层中处理的。

    我的问题是,

    考虑到您有多核环境,我可以使用任何编程实践来更有效地利用可用资源吗?如何更改代码以在多核环境中获得更高的性能?

    4 回复  |  直到 10 年前
        1
  •  14
  •   Michael Aaron Safyan    10 年前

    没错。除非您使用并发性,否则您的程序不会运行得更快(除非核心处理的其他进程更少,因为某些进程正在另一个核心上运行)。但是,如果确实使用并发性,那么更多的内核可以提高实际的并行性(使用更少的内核,并发性是交错的,而使用更多的内核,则可以获得线程之间真正的并行性)。

    使程序高效地并发并不是简单的任务。如果做得不好,使您的程序并发实际上可以使它变慢!例如,如果您花费大量时间生成线程(线程构造非常慢),并且在非常小的块大小上进行工作(这样线程构造的开销就占了实际工作的主导地位),或者如果您经常同步数据(这不仅强制操作连续运行,而且在其上也有非常高的开销)。或者,如果您经常在多个线程之间的同一缓存线中写入数据(这可能导致其中一个核心上的整个缓存线无效),那么您可能会严重损害并发编程的性能。

    同样重要的是要注意,如果你有n个内核,这并不意味着你会得到n的加速,这是加速的理论极限。事实上,对于两个内核,速度可能是两倍,但是对于四个内核,速度可能是三倍,然后对于八个内核,速度大约是三倍半,等等。您的程序实际上能够充分利用这些内核的能力被称为并行可伸缩性。通常,通信和同步开销会阻止线性加速,但是,理想情况下,如果您能够尽可能避免通信和同步,那么您就有希望接近线性。

    对于如何在stackoverflow上编写高效的并行程序,不可能给出完整的答案。这确实是至少一门(可能是几门)计算机科学课程的主题。我建议你报名参加这样的课程或买本书。如果我知道一本好书的话,我会向你推荐一本书,但是我参加的平行算法课程没有这门课的教科书。您可能还对使用串行实现、带多线程的并行实现(常规线程、线程池等)和带消息传递的并行实现(如Hadoop、Apache Spark、云数据流、异步RPC等)编写一些程序感兴趣,然后测量它们的性能、var。在并行实现的情况下,表示核心的数目。这是我的并行算法课程的大部分课程,并且非常有洞察力。您可能尝试并行化的一些计算包括使用蒙特卡罗方法计算pi(这是非常简单的并行化,假设您可以创建一个随机数生成器,其中不同线程中生成的随机数是独立的),执行矩阵乘法,计算矩阵的行梯队形式,求和平方对于一些非常大的数n,是1…n的,我相信你能想到其他的。

        2
  •  4
  •   Vasily Korolev    15 年前

    我不知道这是否是最好的开始,但我已经订阅了文章提要 Intel Software Network 一段时间前,在那里发现了很多有趣的东西,以非常简单的方式呈现。你可以找到一些关于并行计算基本概念的非常基础的文章,比如 this . Here 您可以快速深入到OpenMP中,这是一种可以开始并行化应用程序最慢部分而不更改其余部分的方法。(当然,如果这些零件平行)也要检查 Intel Guide for Developing Multithreaded Applications . 或者去浏览一下 the article section ,文章不是 很多,所以你可以很快找到最适合你的。他们还有论坛和每周 webcast 称为并行编程对话。

        3
  •  3
  •   slyfox    15 年前

    是的,在不改变软件的情况下简单地向系统添加更多的内核不会产生任何结果(除了操作系统能够在单独的内核上调度多个并发进程)。

    要让您的操作系统使用多个核心,您需要做两件事之一:增加每个进程的线程数,或增加同时运行的进程数(或同时运行两个进程!).

    然而,有效地利用核心是一种不同颜色的野兽。如果在线程/进程之间同步共享数据访问花费了太多时间,那么当线程相互等待时,并发性级别会受到影响。这还假设您有一个相对容易并行化的问题/计算,因为算法的并行版本通常比其顺序版本复杂得多。

    也就是说,特别是对于工作单元相互独立的CPU绑定计算,当您向问题抛出更多线程时,很可能会看到线性加速。当您添加串行段和同步块时,这种加速将趋向于降低。

    在多线程环境中,I/O繁重的计算通常最糟糕,因为对物理存储器(尤其是在同一控制器或同一介质上)的访问也是串行的,在这种情况下,线程在释放其他线程以继续进行用户交互或基于CPU的操作时变得更有用。离子。

        4
  •  0
  •   Kevin Little    15 年前

    您可以考虑使用为并发编程设计的编程语言。二郎想起来了。