我正在运行一个执行大量计算(CFD)的简单C程序,因此需要花费大量时间来运行。但是我仍然有很多未使用的CPU和RAM。那么我将如何将一些处理能力分配给一个程序。??
答案 0 :(得分:2)
当Linux需要进行计算时,它不会让程序等待并且CPU处于空闲状态。 您有一个多核CPU和一个单线程正在运行(如@Pankrates所建议),或者您在一些I / O上阻塞。
答案 1 :(得分:2)
我猜测CFD意味着计算流体动力学(但CFD也有很多其他含义,所以我猜错了。)
您绝对应该首先profile您的代码。至少,使用gcc -Wall -pg -O
进行编译,并了解如何使用gprof。您也可以使用strace
查找代码完成的系统调用。
我不是差价合约的专家(即使在上个世纪我与CFD专家合作过)。但是这样的代码使用了很多finite elements analysis和其他向量计算。
如果您正在编写代码,您可能会考虑使用OpenMP(因此,在源代码中仔细添加OpenMP pragmas,可能会加快速度),甚至可以考虑通过编码来使用GPGPU { {3}}在GPU上运行。
您还可以了解有关OpenCL kernels编程的更多信息,并更改代码以使用线程。
如果您正在使用重要的数字库,例如pthreads他们有很多调整,甚至是专门的变体(例如多核,OpenMP,甚至是OpenCL)。
在所有情况下,并行化代码都需要做很多工作。如果可能的话,你会花几周或几个月来改进它。
答案 2 :(得分:1)
你可以用负增量来改善这个过程,但你需要成为超级用户。见
man nice
这会增加进程的调度优先级。如果它与其他进程竞争CPU时间,它将获得更多的CPU时间,因此运行得更快"。
至于增加程序使用的RAM量:您需要重写或重新配置程序以使用更多RAM。鉴于问题中提供的信息,很难说更多。
答案 3 :(得分:1)
要一次使用多个CPU,您需要运行程序的多个副本,或者在程序中运行多个线程。开始时都不是很难。
然而,做一个“我有10000个大数字的并行版本要容易得多,我想知道他们每个人是不是素数”,而不是做“很多A = A” + B“并行计算类型 - 因为您需要新的A才能进行下一步。 CFD计算倾向于做后者[据我所知],但是使用大型数组。您可以将大型矢量计算拆分为一组较小的矢量计算[假设我们有一个1000 x 1000的矩阵,您可以将其分为4组250 x 1000矩阵,或4组500 x 500矩阵,以及在它自己的线程中执行每一个]。
如果它是您自己的代码,那么您希望知道它的作用以及它是如何工作的。如果它是别人的代码,那么你需要与拥有代码的人交谈。
没有神奇的方法可以“自动使用更多CPU”。四核处理器上30%的CPU使用率可能意味着您的系统基本上使用一个核心,并且5%左右是系统中正在进行的其他事情的开销 - 或者可能在您的应用程序中某处使用了第二个线程一点点CPU在做它做的任何事情。或者应用程序是多线程的,但是并没有完全使用多个核心,因为某些共享资源上的线程之间存在争用......我们不可能说出这三个[或其他几个]替代方案中的哪一个。
除非你有一些有用的内容放入内存,否则要求更多的RAM是没有用的。如果有空闲内存,您的应用程序将获得所需的内存。