我在R多核中编写了一些代码,我在24核机器上运行它。实际上只有12个核心,但它们是超线程的,所以它看起来有24个。
这就是奇怪的:所有线程都运行在同一个核心上!所以他们每个人只使用少量的cpu,而不是每个都在一个核心上运行,并且嚼掉所有可用的核心。
为简单起见,我只是运行4个线程:
mclapply( 1:30, function(size) {
# time consuming stuff that is cpu bound (think "forecast.ets" et al)
}, mc.cores = 4, mc.preschedule = F )
在运行之前,已经有一个R进程在一个核心上运行,使用该核心容量的100%:
接下来,我启动了“多核过程”,另外4个线程争夺同一个核心!:
......所以,当他们每个人能够获得100%的核心时,他们每人获得一个核心的12%,或大约1%的可用处理能力。此外,另一个R流程现在只获得50%的核心。
OS是64位的Ubuntu 12.04。硬件是英特尔。 R是版本2.15.2“捣蛋”
思考? (我知道我可以使用降雪,但我有很多变数,而且我真的不想要sfExport
所有变量!)
编辑:哦,我想某处有一些全局锁定?但是,为什么两个完全独立的R进程之间会发生冲突?我可以并行运行两个R进程,每个进程占用核心CPU的100%。
Edit2:感谢Dirk的指针,我重建了openblas,现在看起来更健康了!:
答案 0 :(得分:8)
可能的问题是OpenBLAS程序包可能产生的副作用,它会设置CPU亲和力,使进程粘在一个核心上。有关讨论,请参阅Parallel processing in R limited,并链接到有关修复的r-sig-hpc列表的更多讨论。