强制程序/线程使用100%的处理器资源

时间:2009-07-22 14:30:52

标签: c++ multithreading

我做了一些与绘图软件和数学建模相关的c ++编程。 有些程序需要一到五个小时才能执行并输出结果;但是,他们只占我核心二人组的50%。我在另一台基于双处理器的机器上尝试了相同的结果。

有没有办法强制程序使用所有可用的处理器资源和内存?

注意:我正在使用ubuntu和g ++

9 个答案:

答案 0 :(得分:10)

线程一次只能在一个核心上运行。如果你想使用这两个核心,你需要找到一种方法在另一个线程中完成一半的工作。

这是否可行,如果可行,如何划分线程之间的工作,完全取决于您正在进行的具体工作。

要实际创建新主题,请参阅Boost.Thread docspthreads docsWin32 API docs

[编辑:其他人建议使用库来为您处理线程。我没有提到这些的原因是因为我没有他们的经验,不是因为我认为他们不是一个好主意。它们可能是,但这完全取决于您的算法和平台。线程几乎是通用的,但要注意多线程编程通常很难:你为自己制造了很多问题。]

答案 1 :(得分:5)

最快的方法是阅读有关openMP的内容并使用它来并行化您的程序。

使用命令g++ -fopenmp进行编译,前提是您的g ++版本为>=4

答案 2 :(得分:4)

您需要运行尽可能多的线程,因为有可用的CPU核心,以便能够使用所有处理器时间。 (但你仍然可以被其他任务抢先一步。)

有很多方法可以做到这一点,它完全取决于你正在处理什么。但是,您可以使用OpenMP或类似TBB的库来几乎透明地执行此操作。

答案 3 :(得分:3)

你是正确的,你需要使用线程方法来使用多个核心。 Boost有一个线程库,但这不是整个问题:您还需要更改算法以在线程环境中工作。

有些算法根本无法并行运行 - 例如,SHA-1对其数据进行了多次“传递”,但它们无法进行线程化,因为每次传递都依赖于之前运行的输出。

为了并行化你的程序,你需要确保你的算法可以将问题“分而治之”成独立的块,然后它可以在将它们组合成一个完整的结果之前并行处理。

无论你做什么,都要非常小心地验证答案的正确性。保存单线程代码,以便将其输出与多线程代码的输出进行比较;众所周知,线程很难做到,并且充满了潜在的错误。

您可能更值得花时间完全避免线程化,并尝试分析您的代码:通过优化最常执行的代码,您可以获得显着的速度提升,而不会接近线程的挑战。

答案 4 :(得分:2)

要充分利用多核处理器,您需要使程序成为多线程。

答案 5 :(得分:1)

多线程的替代方法是使用多个进程。你仍然需要划分&将你的问题征服成多个独立的块。

答案 6 :(得分:0)

50%,你的意思是一个核心吗?

如果应用程序不是多进程或多线程,则无法同时使用这两个核心。

答案 7 :(得分:0)

while(1) { }

中的某处添加main()

或者回应真实的建议,要么启动多个进程,要么重写代码以使用线程。我建议运行多个进程,因为这样更容易,但如果你需要加快一次运行速度,它实际上并没有帮助。

答案 8 :(得分:0)

要获得每个线程的100%,您需要:

(在每个帖子中):

  • 消除所有辅助存储I / O. (磁盘读/写)
  • 消除所有显示I / O(屏幕 写/打印)
  • 消除所有锁定机制 (互斥,信号量)
  • 消除所有主存储I / O. (严格按照登记册操作 和缓存,而不是DRAM)。

祝你重写好运!