我做了一些与绘图软件和数学建模相关的c ++编程。 有些程序需要一到五个小时才能执行并输出结果;但是,他们只占我核心二人组的50%。我在另一台基于双处理器的机器上尝试了相同的结果。
有没有办法强制程序使用所有可用的处理器资源和内存?
注意:我正在使用ubuntu和g ++
答案 0 :(得分:10)
线程一次只能在一个核心上运行。如果你想使用这两个核心,你需要找到一种方法在另一个线程中完成一半的工作。
这是否可行,如果可行,如何划分线程之间的工作,完全取决于您正在进行的具体工作。
要实际创建新主题,请参阅Boost.Thread docs,pthreads docs或Win32 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%,您需要:
(在每个帖子中):
祝你重写好运!