【问题标题】:Executing C++ program on multiple processor machine在多处理器机器上执行 C++ 程序
【发布时间】:2011-10-20 09:03:03
【问题描述】:

出于研究目的,我用 C++ 开发了一个程序。需要几天时间才能完成。

现在我在我们的实验室 8core 服务器机器上执行它以快速获得结果,但我看到机器只为我的程序分配了一个处理器并且它保持在 13% 的处理器使用率(即使我将进程优先级设置为高级别和亲和性为 8核心)。

(这是一个简单的面向对象程序,没有任何并行性或多线程)

我如何才能从强大的服务器机器中获得真正的好处? 提前致谢。

【问题讨论】:

  • 13% 的 CPU 使用率可能是由于大量 I/O 使用造成的,即磁盘读取/写入。
  • 1/8 的 CPU(其核心之一)被 100% 使用等于 12.5% 的总体使用率。还有 13%。

标签: c++ multiprocess


【解决方案1】:

将您的代码分成可以并行执行的块。

你需要去阅读data parallelismtask parallelism

然后您可以使用OpenMPMPI 打破你的程序。

【讨论】:

  • 当然,首先使用分析器找出哪些部分如此缓慢。并行化启动屏幕代码通常没有什么意义;)
  • 一个人应该总是先调整慢代码。这是假设的。 OP 询问他如何使用他的多个处理器(“强大的机器”)。
【解决方案2】:

(这是一个简单的面向对象程序,没有任何并行性或 多线程)

我如何才能从强大的服务器机器中获得真正的好处?

通过使用更多线程。无论计算机多么强大,它都无法将线程分布在多个处理器上。找到程序的独立部分并并行运行它们。

  • C++0x 线程
  • 提升线程
  • OpenMP

我个人认为 OpenMP 是一个玩具。您可能应该选择其他两个中的一个。

【讨论】:

  • 同意。这是一个解释您的错误的真实示例。想象一个孕妇:她需要 9 个月的时间来“制造”一个婴儿。现在,如果您再添加 7 个女性,婴儿将不会更快到达,因为怀孕并不意味着在几个女性之间共享......对于您的程序也是如此,在您的情况下,8 核心并不比 1 核心快。您必须有一种方法将工作分成几部分,将它们分配给工人,然后重新组合结果。
  • @Offirmo 很好的例子,但我不认为它是“真实世界”:))
  • 你知道 boost::threads 在不同处理器上运行的例子吗?对我 (see) 来说,它们都在一个处理器上运行,而其他处理器未使用。
【解决方案3】:

您必须通过将代码拆分为可以独立执行的多个任务来显式利用多并行性,然后直接使用线程原语或更高级别的并行化框架,例如OpenMP

【讨论】:

    【解决方案4】:

    如果您不想让您的程序本身使用多线程库或技术,您可以尝试将您的工作分成几个独立的块。然后运行程序的多个副本...每个都分配给不同的块,通过获取不同的命令行参数来指定。

    至于一般地提高程序的性能...有一些分析工具可以帮助您加快或发现内存使用、I/O、CPU 的瓶颈:

    https://stackoverflow.com/questions/tagged/c%2b%2b%20profiling

    不会帮助您将工作分散到多个内核,但如果您可以在算法中获得 8 倍的加速,那么它可能比多线程在 8 个内核上提供的帮助更多。只是需要考虑的其他事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-24
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 2012-04-06
      • 1970-01-01
      相关资源
      最近更新 更多