【问题标题】:Force Program / Thread to use 100% of processor(s) resources强制程序/线程使用 100% 的处理器资源
【发布时间】:2009-07-22 14:30:51
【问题描述】:

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

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

注意:我使用的是 ubuntu 和 g++

【问题讨论】:

    标签: c++ multithreading


    【解决方案1】:

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

    这是否可能,如果可以,如何在线程之间分配工作,完全取决于您正在做的具体工作。

    要实际创建一个新线程,请参阅Boost.Thread docspthreads docsWin32 API docs

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

    【讨论】:

    • @Edit:是的,我看不出在 C++ 中使用库(如 boost)有什么意义。 =/ @Mild-Offtopic:是的,最近大致学习了 C++ 中的线程。 :-) 好建议。 :)
    • @Zack:你的意思是说你没有看到在 C++ 中使用库的意义吗?因为 Boost 很棒。
    • 使用并发库/数据结构/设计模式的关键在于它简化了一些与并发相关的问题。通过合适的设计,只需少数组件具有并发意识就足够了,其余组件可以是单线程的,同时仍能利用所有可用的 CPU 内核。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您需要运行与可用 CPU 内核一样多的线程,以便能够潜在地使用所有处理器时间。 (不过,您仍然可以被其他任务抢占。)

      有很多方法可以做到这一点,这完全取决于您正在处理的内容。不过,您也许可以使用 OpenMP 或 TBB 之类的库来几乎透明地进行操作。

      【讨论】:

        【解决方案4】:

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

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

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            多线程的一种替代方法是使用多个进程。您仍然需要将问题划分为多个独立的块。

            【讨论】:

            • +1 为什么人们总是忘记这个选项?在某些情况下,它可以比线程更容易正确和扩展(无需锁定以访问相同地址空间中的相同 malloc/free 堆)。
            【解决方案7】:

            50% 是指只有一个核心吗?

            如果应用程序既不是多进程也不是多线程的,那么它就不可能同时使用两个内核。

            【讨论】:

              【解决方案8】:

              main() 的某处添加while(1) { }

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

              【讨论】:

                【解决方案9】:

                要使每个线程达到 100%,您需要:

                (在每个线程中):

                • 消除所有辅助存储 I/O (磁盘读/写)
                • 消除所有显示 I/O(屏幕 写/打印)
                • 消除所有锁定机制 (互斥体、信号量)
                • 消除所有主存储 I/O (严格在寄存器外操作 和缓存,而不是 DRAM)。

                祝你改写好运!

                【讨论】:

                • 有时候说真话是不值得的。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-05-23
                • 2010-09-09
                • 1970-01-01
                • 2013-02-05
                • 2012-10-27
                • 1970-01-01
                相关资源
                最近更新 更多