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 Rscript
s 我们无法判断 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能力。
(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 Rscript
s 我们无法判断 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能力。