2

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

4

4 回答 4

2

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

您绝对应该首先分析您的代码。至少,编译它gcc -Wall -pg -O并学习如何使用gprof。您还可以使用strace来找出您的代码完成的系统调用。

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

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

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

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

在所有情况下,并行化您的代码都是一项繁重的工作。如果可能的话,您将花费数周或数月的时间来改进它。

于 2013-02-09T16:17:23.100 回答
2

当程序需要进行计算时,Linux 不会让程序等待并释放 CPU。要么你有一个多核 CPU 和一个正在运行的单线程(正如@Pankrates 所建议的那样),要么你阻塞了一些 I/O。

于 2013-02-09T10:24:15.903 回答
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 不会有帮助。如果有可用内存,您的应用程序将获得所需的内存。

于 2013-02-09T13:39:24.800 回答
1

您可以使用负增量来完善该过程,但您需要成为超级用户。看

man nice

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

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

于 2013-02-09T10:18:32.193 回答