【发布时间】:2009-07-22 14:30:51
【问题描述】:
我做了一些与绘图软件和数学建模相关的 c++ 编程。 有些程序需要一到五个小时来执行和输出结果;但是,它们只消耗了我核心二重奏的 50%。我在另一台基于双处理器的机器上尝试了代码,结果相同。
有没有办法强制程序使用所有可用的处理器资源和内存?
注意:我使用的是 ubuntu 和 g++
【问题讨论】:
标签: c++ multithreading
我做了一些与绘图软件和数学建模相关的 c++ 编程。 有些程序需要一到五个小时来执行和输出结果;但是,它们只消耗了我核心二重奏的 50%。我在另一台基于双处理器的机器上尝试了代码,结果相同。
有没有办法强制程序使用所有可用的处理器资源和内存?
注意:我使用的是 ubuntu 和 g++
【问题讨论】:
标签: c++ multithreading
一个线程一次只能在一个内核上运行。如果你想同时使用这两个内核,你需要找到一种方法在另一个线程中完成一半的工作。
这是否可能,如果可以,如何在线程之间分配工作,完全取决于您正在做的具体工作。
要实际创建一个新线程,请参阅Boost.Thread docs、pthreads docs 或Win32 API docs。
[编辑:其他人建议使用库为您处理线程。我没有提到这些的原因是因为我对它们没有经验,而不是因为我认为它们不是一个好主意。它们可能是,但这完全取决于您的算法和平台。线程几乎是通用的,但要注意多线程编程通常很困难:你自己会制造很多问题。]
【讨论】:
最快的方法是阅读有关 openMP 并使用它来并行化您的程序。
使用命令g++ -fopenmp编译,前提是你的g++版本是>=4
【讨论】:
您需要运行与可用 CPU 内核一样多的线程,以便能够潜在地使用所有处理器时间。 (不过,您仍然可以被其他任务抢占。)
有很多方法可以做到这一点,这完全取决于您正在处理的内容。不过,您也许可以使用 OpenMP 或 TBB 之类的库来几乎透明地进行操作。
【讨论】:
您是对的,您需要使用线程方法来使用多个内核。 Boost 有一个线程库,但这不是问题的全部:您还需要更改算法以在线程环境中工作。
有些算法根本无法并行运行——例如,SHA-1 对其数据进行了多次“遍历”,但它们无法线程化,因为每次遍历都依赖于之前运行的输出。
为了使您的程序并行化,您需要确保您的算法可以将问题“分而治之”成独立的块,然后在将它们组合成完整结果之前并行处理这些块。
无论你做什么,都要非常小心地验证你的答案的正确性。保存单线程代码,以便您可以将其输出与多线程代码的输出进行比较;线程是出了名的难做,而且充满了潜在的错误。
完全避免线程化可能更值得您花时间尝试分析您的代码:您可以通过优化最常执行的代码来显着提高速度,而不会遇到线程化的挑战。
【讨论】:
要充分利用多核处理器,您需要使程序多线程。
【讨论】:
多线程的一种替代方法是使用多个进程。您仍然需要将问题划分为多个独立的块。
【讨论】:
50% 是指只有一个核心吗?
如果应用程序既不是多进程也不是多线程的,那么它就不可能同时使用两个内核。
【讨论】:
在main() 的某处添加while(1) { }?
或者为了回应真实的建议,要么启动多个进程,要么重写代码以使用线程。我建议运行多个进程,因为这样更容易,但如果您需要加快单个运行,它并没有真正的帮助。
【讨论】:
要使每个线程达到 100%,您需要:
(在每个线程中):
祝你改写好运!
【讨论】: