R 和 GNU Parallel - 如何限制使用的核心数

R and GNU Parallel - How to limit number of cores used

(GNU Parallel 新手)

我的目标是 运行 具有不同参数的相同 Rscript 在多个内核上。我的第一个问题是让它在我的笔记本电脑上运行(2 个真实内核,4 个虚拟内核),然后我将把它移植到一个有 64 个内核的笔记本电脑上。

目前:

我有一个 Rscript,"Test.R",它接受参数,做一件事(比如添加一些数字然后将其写入文件),然后停止。

我有一个包含以下内容的 "commands.txt" 文件:

/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 100
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 200 1000

所以这告诉 GNU 使用 R 与 运行 Test.R 并行(我已经使用 anaconda 安装了它)

在终端中(导航到 Test.R 和 commands.txt 所在的桌面后)我使用命令:

parallel --jobs 2 < commands.txt

我想要它做的是使用 2 个内核和 运行 命令,从 commands.txt 开始,直到完成所有任务。 (我尝试了此命令的变体,例如将 2 更改为 1,在本例中,2 个核心 运行 为 100%,另外 2 个 运行 约为 20-30%) .

当我 运行 这样做时,所有 4 个核心都达到 100%(从 htop 可以看出),前 2 个作业完成,并且没有更多的作业完成,尽管所有 4 个核心仍在在 100%。

当我 运行 在 64 核计算上执行相同的命令时,所有 64 核都达到 100%,我不得不取消作业。

任何有关要查看的资源或我做错了什么的建议都将不胜感激。

有点长的问题,如果我能澄清任何问题,请告诉我。

在执行上述命令期间 运行htop 的请求输出(按 CPU%:

排序
   1  [||||||||||||||||||||||||100.0%]   Tasks: 490, 490 thr; 4 running
   2  [|||||||||||||||||||||||||99.3%]   Load average: 4.24 3.46 4.12 
   3  [||||||||||||||||||||||||100.0%]   Uptime: 1 day, 18:56:02
   4  [||||||||||||||||||||||||100.0%]
   Mem[|||||||||||||||||||5.83G/8.00G]
   Swp[||||||||||          678M/2.00G]

   PID USER      PRI  NI  VIRT   RES S CPU% MEM%   TIME+  Command
  9719 user     16   0 4763M  291M ? 182.  3.6  0:19.74 /Users/user/anaconda3
  9711 user     16   0 4763M  294M ? 182.  3.6  0:20.69 /Users/user/anaconda3
  7575 user     24   0 4446M 94240 ? 11.7  1.1  1:52.76 /Applications/Utilities
  8833 user     17   0 86.0G  259M ?  0.8  3.2  1:33.25 /System/Library/StagedF
  9709 user     24   0 4195M  2664 R  0.2  0.0  0:00.12 htop
  9676 user     24   0 4197M 14496 ?  0.0  0.2  0:00.13 perl /usr/local/bin/par

根据 htop 的输出,脚本 /Users/name/anaconda3/lib/R/bin/Rscript 使用了多个 CPU 线程 (182%)。你有 4 个 CPU 线程,因为你 运行 2 Rscripts 我们无法判断 Rscript 是否会吃掉所有 4 CPU 个线程,如果它 运行通过它自己。也许它会吃掉所有可用的 CPU 个线程(你在 64 核机器上的测试表明了这一点)。

如果您正在使用 GNU/Linux,您可以限制程序可以使用 CPU 个线程 taskset:

taskset 9 parallel --jobs 2 < commands.txt

这应该强制 GNU Parallel(及其所有子项)仅使用 CPU 线程 1 和 4(二进制中的 9:1001)。因此 运行ning 应该将两个作业限制为 运行 仅在两个线程中。

通过使用 9(二进制 1001)或 6(二进制 0110),我们可以合理地确定两个 CPU 线程位于两个不同的内核上。 3(二进制 11)可能指的是 CPU 核心上的两个线程,因此可能会更慢。 5(二进制 101)也是如此。

一般来说,您希望使用尽可能多的 CPU 线程,这通常会使计算速度更快。从你的问题中不清楚你为什么要避免这种情况。

如果您与他人共享服务器,更好的解决方案是使用 nice。这样你就可以使用其他人没有使用的所有CPU能力。