【问题标题】:How can I parallel-ize an algorithm on a machine with multiple processors?如何在具有多个处理器的机器上并行化算法?
【发布时间】:2010-08-27 19:37:51
【问题描述】:
  • Intel Core2Duo,例如应该有一个芯片但两个内核

  • 所以,应该可以控制在哪个核上处理什么,这意味着可以指示我的算法并行使用两个核。

问题是怎么做的?

我需要在内核级别执行此操作,还是有更简单的方法?更具体地说,实现双核合并排序需要什么?

【问题讨论】:

  • 大声笑,我读到瘫痪:-(
  • 我认为这是一个非常真实的问题,有一些很好的答案!

标签: c algorithm sorting parallel-processing mergesort


【解决方案1】:

从您过去的问题来看,我会说您希望在 C/C++ 中实现,但我相信无论使用哪种语言,答案都大致相同。

如果您想并行化任何操作,请将其设为多线程。您可以拥有与内核一样多的并行并发线程。

这是一个相关的问题: How to implement divide and conquer algorithms in C# using multithreading?

据我了解,将特定线程绑定到内核或处理器称为processor affinity。这通常不是一个好主意,因为操作系统的目的是在处理器之间处理线程。你不可能比操作系统做得更好。

【讨论】:

  • 对于细粒度并行,您希望使用某种线程池,而不是为每个并行任务支付新线程的启动成本。
  • 我在处理器亲和力方面做了很多工作,相信我,只要你正确分析你的问题,你肯定可以比操作系统做得更好,但线程也是如此。
【解决方案2】:

要实现利用多核的算法,请考虑OpenMP

当然,具有强数据依赖性的算法可能无法很好地并行化。

【讨论】:

  • @polemon:考虑到 OpenMP 通常更易于使用(至少对于容易并行化的问题,但由于这个主题似乎面向初学者,这就是(希望)我们是什么)谈论)
  • OpenMP 更适合细粒度的并行,pthreads 更适合不太细的并行,fork 更适合粗粒度的并行,分布式系统(集群)更适合极粗的并行。这个问题非常细粒度,所以我认为你会疯狂地使用 fork 来解决它。
【解决方案3】:

我希望您希望为每个核心分配线程.. 这是对可以做什么以及如何做的详细说明。

Processor affinity

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    A Specimen of Parallel Programming: Parallel Merge Sort Implementation。这是Erlang 中的一个。要获得更准确的答案,您必须提出更准确的问题。

    【讨论】:

      【解决方案5】:

      这取决于您想要实现这一点的编程语言。例如:

      只需选择语言并寻找该语言的并行处理能力。

      祝你好运!

      【讨论】:

        【解决方案6】:

        虽然 POSIX 线程 (pthreads) 可能是一个好主意,但这并不是唯一的。

        C 中的多线程实际上并不是微不足道的,因此,我建议 fork()

        使用您的归并排序算法的一个子部分为每个 CPU 启动一个工作分支,然后在管理器分支中重新组装它们。

        在开发并行解决方案时,我会在线程之前考虑分叉,因为它们更容易实现,并且您可以快速获得初步结果。一旦成功,您可能需要花一些时间来使用 pthread。

        【讨论】:

          猜你喜欢
          • 2017-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多