对于使用四核处理器的所有内核,我需要在代码中更改的是添加对多线程的支持,还是由操作系统自身处理。我有FreeBSD,我使用的语言是C ++。我想给我的应用程序提供至少90%的完整CPU周期。
答案 0 :(得分:21)
你need某种形式的并行性。多线程或多处理都可以。
通常,多个线程可以更容易处理(因为它们可以访问共享数据),而不是多个进程。但是,通常,多个线程要处理(因为它们访问共享数据)更难而不是多个进程。 而且,是的,我刻意写了这个。
如果您有SIMD方案,那么查看OpenMP的Ninefingers' suggestion也非常好。 (如果您不知道SIMD的含义,请参阅下面的Ninefingers的有用评论。)
答案 1 :(得分:11)
对于C ++中的多线程应用程序,我建议使用Boost.Thread来帮助您充分发挥四核机器的潜力。
至于更改代码,您可能希望考虑尽可能使其不可变。调试线程之间的状态转换要困难得多。有许多事情可能会以意想不到的方式发生。见this SO帖子。
答案 2 :(得分:10)
此处未提及的另一个选项,即提示,是通过-fopenmp
和libgomp
库使用OpenMP,我在FreeBSD 8系统上安装了这两个库。
这些指令可以使#pragma
指令并行化某些循环,同时使用语句等,即可以并行化的位。它负责您的线程和cpu关联。请注意,它是一种通用解决方案,因此可能不是并行化的最佳方式,但它允许您并行化某些例程。
看看这个:https://computing.llnl.gov/tutorials/openMP/
至于使用线程/进程本身,某些例程和工作方式适合它。你能以这种方式解决问题吗? fork()你的进程或创建一个线程是否有意义?如果是这样,那么这样做,但如果没有,请不要试图强制您的应用程序是多线程的,因为。我通常给出的一个例子是最常见的除数算法 - 它依赖于传统实现中所有时间之前的步骤,因此难以并行。
另外请注意,众所周知,对于某些算法,并行化对于并行执行的任何操作的小值实际上都较慢,因为虽然作业完成得更快,但分叉和连接的相关时间成本(是线程或实际上,将时间推到了串行实现的时间之上。
答案 3 :(得分:3)
我认为你唯一的选择是运行多个线程。如果您的应用程序是单线程的,那么它将只在其中一个核心上运行(一次),但如果您有更多线程,它们可以同时运行。
答案 4 :(得分:2)
我想给我的应用程序提供至少90%的完整CPU周期。
为什么呢?你的芯片还不够热?
说真的,世界专家花费数十甚至数百小时来并行化和负载均衡应用程序,以便它使用所有四个核心中的90%。 您的CPU已经支付,无论您是否使用它,其费用都相同。 (实际上,如果你不使用它,它的运行成本会略低一些,电气说话。)你的时间值多少钱?您愿意投入多少小时才能更有效地使用可能花费300美元的资源,而且大部分时间可能都处于空闲状态?
通过并行可以获得加速,但在人类时间非常昂贵。你需要一个很好的理由来证明这一点。 (学习如何充分理由。)
我所知道的关于并行编程的所有好书都是针对C ++以外的语言,并且有充分的理由。如果你想要并行的有趣东西,请查看隐式并行程序在pH 或并行编程在ML 或Fortress Project。
答案 5 :(得分:1)
您需要通过使用线程为应用程序添加对并行性的支持。
一旦你支持并行性,操作系统就可以将你的线程分配给CPU内核。
答案 6 :(得分:0)
我认为你应该首先考虑的是你的应用程序及其算法是否适合在parellel中执行(或者可能作为一组可以独立处理的串行任务)。如果不是这种情况,则难以多线程化或将其分解为并行进程,您可能需要考虑修改它的工作方式。
一旦确定您将能够从并行处理中受益,您可以选择使用多个进程或线程。选择很大程度上取决于应用程序的性质以及并行流程的独立性。在线程之间协调和共享数据更容易,因为它们处于相同的过程中,但是开发和调试也更具挑战性。
如果您决定沿着多线程路线走下去,Boost.Thread是一个很好的库。