我在分别具有 4 个和 8 个物理内核和逻辑内核的 PC(OS Linux)上运行以下代码(从doParallel 的 Vignettes中提取)。
使用或更少运行代码iter=1e+6
,一切都很好,我可以从 CPU 使用情况中看到,所有内核都用于此计算。然而,随着迭代次数的增加(例如iter=4e+6
),并行计算似乎在这种情况下不起作用。当我还监控 CPU 使用率时,只有一个核心参与计算(100% 使用率)。
示例 1
require("doParallel")
require("foreach")
registerDoParallel(cores=8)
x <- iris[which(iris[,5] != "setosa"), c(1,5)]
iter=4e+6
ptime <- system.time({
r <- foreach(i=1:iter, .combine=rbind) %dopar% {
ind <- sample(100, 100, replace=TRUE)
result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
coefficients(result1)
}
})[3]
你知道可能是什么原因吗?记忆可能是原因吗?
我四处搜索,发现这与我的问题有关,但关键是我没有遇到任何错误,而且 OP 似乎通过在foreach
循环中提供必要的包来提出解决方案。但是可以看出,我的循环中没有使用任何包。
更新1
我的问题仍然没有解决。根据我的实验,我不认为记忆可能是原因。我在运行以下简单并行(在所有 8 个逻辑内核上)迭代的系统上有 8GB 内存:
示例 2
require("doParallel")
require("foreach")
registerDoParallel(cores=8)
iter=4e+6
ptime <- system.time({
r <- foreach(i=1:iter, .combine=rbind) %dopar% {
i
}
})[3]
我运行这段代码没有问题,但是当我监控 CPU 使用率时,只有一个核心(共 8 个)是 100%。
更新2
至于Example2,@SteveWeston(感谢您指出这一点)表示(在评论中):“您更新中的示例遇到了小任务。只有主人有任何真正的工作要做,包括发送任务和处理“
但是,Example1仍未解决。当我运行它并使用 监视进程htop
时,更详细的情况如下:
p1
让我们通过命名所有 8 个创建的进程p8
。状态(中的列S
)htop
表示p1
它R
正在运行并且保持不变。然而,p2
直到p8
,几分钟后,状态变为D
(即不间断睡眠),几分钟后,再次变为Z
(即终止但未被其父级收割)。你知道为什么会这样吗?