繁体   English   中英

如何在Linux中为AC程序分配更多的CPU和RAM

[英]how to allocate more cpu and RAM to a c program in linux

我正在运行一个简单的C程序,该程序执行大量计算(CFD),因此需要大量时间才能运行。 但是我仍然有很多未使用的CPU和RAM。 那么我将如何分配我的一些处理能力给一个程序呢?

在需要进行计算时,Linux不会使程序等待,并且不会占用CPU。 您有一个多核CPU和一个单线程正在运行(如@Pankrates所建议),或者您正在阻塞某些I / O。

我猜想CFD意味着计算流体动力学(但是CFD还有很多其他含义,所以我可能猜错了)。

您绝对应该首先配置您的代码。 至少要使用gcc -Wall -pg -O编译,并学习如何使用gprof 您可能还使用strace来查找由代码完成的系统调用。

我不是CFD专家(即使在上个世纪我曾与CFD专家合作)。 但是这样的代码使用了大量的有限元分析和其他向量计算。

如果您正在编写代码,则可能考虑使用OpenMP (因此,通过在源代码中仔细添加OpenMP编译指示 ,可以加快速度),甚至可以考虑通过对在GPU上运行的OpenCL内核进行编码来使用GPGPU。

您还可以了解有关pthreads编程的更多信息,并更改代码以使用线程。

如果您正在使用重要的数值库(例如BLAS),则它们会有很多调整,甚至是专门的变体(例如,多核,OpenMP-ed,甚至在OpenCL中)。

在所有情况下,并行化代码都是很多工作。 如果可能的话,您将花费数周或数月的时间对其进行改进。

您可以使用负增量来改善该过程,但是您需要为此超级用户。 看到

man nice

这将增加进程的调度优先级。 如果它正在与其他进程争用CPU时间,它将获得更多的CPU时间,因此“运行得更快”。

至于增加程序使用的RAM数量:您需要重写或重新配置程序以使用更多的RAM。 考虑到问题中可用的信息,很难说更多。

要一次使用多个CPU,您要么需要运行程序的多个副本,要么需要在程序中运行多个线程。 两者都不是很难开始的。

但是,并行编写“我有10000个大数,我想为它们中的每一个查找素数”要容易得多,而不是“大量A = A + B”并行键入计算-因为在进行下一步之前需要新的A。 就我所知,CFD计算倾向于使用后者,但是要使用大型数组。 您可以将大型矢量计算拆分为一组较小的矢量计算[例如,我们有1000 x 1000的矩阵,可以将其拆分为4组250 x 1000矩阵,或4组500 x 500矩阵,并且在自己的线程中执行每个操作]。

如果这是您自己的代码,那么您希望知道它的作用和工作方式。 如果是别人的代码,那么您需要与拥有该代码的人交谈。

没有一种神奇的方式来“自动利用更多的CPU”。 四核处理器上30%的CPU使用率可能意味着您的系统基本上是在使用一个内核,而系统中发生的其他事情的开销则在5%左右-或者您的应用程序中的某个地方使用了第二个线程一点点CPU做任何事情。 或应用程序是多线程的,但没有完全使用多个内核,因为线程之间在某些共享资源上存在争用……对于我们来说,这三种[或其他几种选择]中的哪一个是不可能的。

除非您有一些有用的东西可以放入内存,否则请求更多的RAM不会有帮助。 如果有可用内存,则您的应用程序将获得所需的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM