multithreading - R system()进程始终使用相同的CPU,而不是多线程/多核

标签 multithreading r process multicore

在 Linux 3.12.0 上的 R 3.0.2 中,我使用 system() 函数来执行许多任务。理想的效果是每个任务都像我通过 R system() 外部的 Rscript 在命令行上执行它们一样运行。

但是,当通过 system() 在 R 内部执行它们时,每个任务都与主 R 进程的同一个 CPU 绑定(bind)。

换句话说:

当直接从 R 之外的 bash shell 通过 RScript 启动时,每个任务尽可能在自己的核心上运行(这是期望的)

当通过 system() 在 R 内部启动时,每个任务都在同一个内核上运行。没有多核共享。如果我有 100 个任务,它们都会卡在一个核心上。

我不知道如何在 R 内部生成一个进程,以便每个进程都使用自己的核心。

我正在使用一个简单的测试来消耗 CPU 周期,以便我可以使用 top/htop 来测量效果:

dd if=/dev/urandom bs=32k count=1000 | bzip2 -9 >> /dev/null

当这个简单的测试在 R 外部多次启动时,每次迭代都有自己的核心。但是当我在 R 中启动它时:

system("dd if=/dev/urandom bs=32k count=2000 | bzip2 -9 >> /dev/null", ignore.stdout=TRUE,ignore.stderr=TRUE,wait=FALSE)

它们都被困在一个核心上。

这是运行 4 次同时/并发的 system() 迭代后的可视化结果。

enter image description here

请帮助我,我需要能够告诉 R 启动新任务,每个任务都在自己的核心中运行。

2013 年 12 月 4 日更新:

我尝试使用 Python 进行测试:

import thread
thread.start_new_thread(os.system,("/bin/dd if=/dev/urandom of=/dev/null bs=32k count=2000",))

我多次重复新线程,并且正如预期的那样,一切正常(使用多个核心,每个线程一个)。

所以我想在 R 中安装 rPython 包,并在 R 中尝试相同的操作:

python.exec("import thread")
python.exec("thread.start_new_thread(os.system,('/bin/dd if=/dev/urandom of=/dev/null bs=32k count=2000',))")

不幸的是,即使在重复调用之后,它仍然仅限于单个核心。为什么从 R 执行时启动的所有内容都仅限于单个核心?

最佳答案

根据 @agstudy 的评论,您应该首先让 parallel 工作。在我的系统上,这使用多个核心:

f<-function(x)system("dd if=/dev/urandom bs=32k count=2000 | bzip2 -9 >> /dev/null", ignore.stdout=TRUE,ignore.stderr=TRUE,wait=FALSE)
library(parallel)
mclapply(1:4,f,mc.cores=4)

我自己会在评论中写下这个,但它太长了。我知道您说过您已经尝试过并行包,但我想确认您是否正确使用它。如果它不起作用,您能否确认非系统调用正确使用了 mclapply,就像这个一样?

a<-mclapply(rep(1e8,4),rnorm,mc.cores=4)
<小时/>

阅读您的评论,我怀疑您的 pthreads Linux 软件包已过时且已损坏。在我的系统上,我使用的是 libpthread-2.15.so(不是 2.13)。如果您使用的是 Ubuntu,则可以使用 apt-get install libpthread-stubs0 获取最新版本。

另请注意,您应该使用并行,而不是多核。如果你看at the docs对于并行,您会注意到他们已经合并了多核方面的工作。

<小时/>

阅读您的下一组评论,我必须坚持认为它是并行,而不是自 2.14 以来包含在 R 中的多核。您可以在 CRAN Task View 上阅读相关内容。 。

并行工作至关重要。我之前告诉过您可以直接从源代码编译它,但这是不正确的。我想重新编译它的唯一方法是从源代码编译 R。

您还能验证一下您的 CPU 亲和性设置是否正确吗?另外你能检查一下R是否可以检测到核心数量吗?只需运行:

library(parallel)
mcaffinity()
# Should be c(1,2,3,4) for you.
detectCores()
# Should be 4 for you.

关于multithreading - R system()进程始终使用相同的CPU,而不是多线程/多核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20324448/

相关文章:

c++ - volatile 成员函数 (C++)

c# - 如何在我的表单停止响应的情况下填充数据 GridView ?

java - 如何中断给定 Future 对象的线程?

c++ - fork() 和 exec() 两个子进程

node.js - 阻止 Node 进程退出的最简单的代码量是多少?

java - 使用 Spring @Transactional 进行 TestNG 多线程测试

r - 如何获取经纬度范围内的 map ?

r - 如何对R中的两个变量进行交叉制表?

r - 如何在 R 中引导

c - 当进程 fork 时,共享库 .so 是否仍在地址空间中?构造函数会再次执行吗?