2010-03-30 55 views
9

要使用四核处理器的所有内核,我需要在代码中更改哪些内容,是关于添加对多线程的支持还是由操作系统本身负责。我有FreeBSD,我使用的语言是C++。我想给我的应用程序提供完整的CPU周期至少90%。如何在应用程序中使用四核CPU

+9

被警告。线程是一件令人头疼的事情,为现有的应用程序增加线程支持更加糟糕。 – Yacoby 2010-03-30 13:20:23

+7

通常,使用4核CPU的最简单方法是运行4个程序副本。如果由于数据结构的原因,这很不重要,所有建议的线程解决方案都很难。 – MSalters 2010-03-30 13:28:52

+1

您可以在没有(程序员可见)共享状态的情况下使用基于角色的并发来消除多线程编程所带来的许多麻烦,但只有在您的架构能够以这种方式建模时才能使用。 – 2010-03-30 14:01:18

回答

11

对于C++中的多线程应用程序,我建议Boost.Thread这应该可以帮助您充分利用四核机器的全部潜力。

至于改变你的代码,你可能想考虑使事物尽可能不变。线程之间的状态转换更难以调试。有太多可能以意想不到的方式发生的事情。请参阅this SO线程。

3

我认为你唯一的选择是运行多个线程。如果你的应用程序是单线程的,那么它将只运行在其中一个内核上(一次),但是如果你有更多的线程,它们可以同时运行。

+1

如上所述,另一种选择是运行同一程序的多个副本。根据问题的性质,这可能会也可能不容易(请参阅http://en.wikipedia.org/wiki/Embarrassingly_parallel)。 – KeithB 2010-03-30 18:54:13

1

您需要通过使用Threading为应用程序添加对并行性的支持。

一旦您支持并行性,则需要由操作系统将线程分配给CPU内核。

10

另一个在这里没有提到的选项是使用OpenMP,通过-fopenmplibgomp库,这两个库都安装在我的FreeBSD 8系统上。

这些给你#pragma指令并行化某些循环,而语句等,即你可以并行的位。它为您处理线程和CPU关联。请注意,这是一个通用的解决方案,因此可能不是最佳并行方式,但它可以让您平行某些例程。

看看这个:https://computing.llnl.gov/tutorials/openMP/

至于使用线程/进程本身,某些程序和工作借给自己给它的方式。你能以这种方式分解任务吗? fork()你的过程还是创建一个线程是否有意义?如果是这样,那么,如果不是这样,不要试图强制你的应用程序是多线程的,因为。我通常给出的一个例子是最大公约数算法 - 它依赖于传统实现中所有时间之前的步骤,因此很难并行化。

另请注意,众所周知,对于某些算法来说,并行处理实际上对于并行处理的小值很慢,因为虽然作业更快完成,但分叉和连接的相关时间成本(是线程或进程)实际上将时间推到串行实现的时间之上。

19

need某种形式的并行性。多线程或多处理将会很好。

一般,多线程容易处理(因为他们可以访问共享数据)不是多个过程。但是,通常,多个线程都是来处理(因为他们访问共享数据)比多个进程。 而且,是的,我故意写了这个。

如果你有一个SIMD场景,看看OpenMP的Ninefingers' suggestion也很不错。 (如果您不知道SIMD的含义,请参阅下面的Ninefingers的有用评论。)

+0

是自相矛盾的故意吗?我同意,fork()和线程都有优点/缺点。 – 2010-03-30 13:30:04

+1

我这么认为。 +1。 – 2010-03-30 13:33:17

+4

+1为自我矛盾:-) – Sebastian 2010-03-30 14:14:18

0

我认为您应该关注的第一件事是您的应用程序及其算法是否适合在parellel中执行(或者可能作为一组可以独立处理的串行任务)。如果情况并非如此,那么很难多线程化或将其分解为并行进程,并且您可能需要考虑修改其工作方式。

确定可以从并行处理中受益后,您可以选择使用多个进程或线程。这个选择很大程度上取决于应用程序的性质以及并行进程的独立性。因为它们处于相同的过程中,所以在线程之间协调和共享数据更容易,但开发和调试的难度也更大。

如果您决定关闭多线程路由,Boost.Thread是一个很好的库。

2

我想给我的应用程序提供完整的CPU周期至少90%。

为什么?你的芯片不够热?

严重的是,它需要世界各地的专家数十名,如果没有了数百个小时并行负载均衡的应用程序,以便它使用90%的所有4个内核。 您的CPU已经支付,无论您是否使用它,其成本都是相同的。 (实际上,如果你不使用它,它的运行成本会稍微低一点,从电子方面讲,)你的时间值多少钱?您愿意投资多少小时才能更有效地使用可能花费300美元的资源,并且可能大部分时间都处于闲置状态?

有可能通过并行获得的速度提升,但它的在人类的时间昂贵。你需要一个很好的理由来证明这一点。 (学习如何是一个足够好的理由。)

我对并行编程知道的所有优秀书籍都是针对C++以外的语言,并且有很好的理由。如果你想在并行性方面感兴趣的东西检查出隐式并行程序min在pH并行编程在MLFortress Project

+0

没有人阅读这个答案会惊讶我的答案“你如何利用多核”http://stackoverflow.com/questions/363341/how-are-you-taking-advantage-of-multicore :-) – 2010-03-31 01:15:41

相关问题