我遇到了一些并行运行嵌套foreach
循环的问题。情况如下:
该程序基本上使用不同数量的观察结果和不同的统计显着性水平进行假设检验。我有四个嵌套的foreach循环。项data.structures
是执行测试的矩阵列表。我正在为data.structures
使用两个不同的列表。一个列表包含243个矩阵(小列表),另一个包含19,683个(大列表)。
number.observations = c(50,100,250,500,1000)
significance.levels = c(.001,.01,.05,.1,.15)
require(foreach)
require(doParallel)
cl = makeCluster(detectCores())
registerDoParallel(cl)
results = foreach(data=data.structures,.inorder=FALSE,.combine='rbind') %:%
foreach(iter=1:iterations,.inorder=FALSE,.combine='rbind') %:%
foreach(number.observations=observations,.inorder=FALSE,.combine='rbind') %:%
foreach(alpha=significance.levels,.inorder=FALSE,.combine='rbind') %dopar% {
#SOME FUNCTIONS HERE
}
当我使用data.structures
的小型矩阵列表时,我可以在Windows资源监视器中看到所有核心都被充分利用(100%CPU使用率),每个核心有8个线程,用于8个进程,在更短的时间内按预期完成。但是,当我更改为更大的矩阵列表时,将启动这些过程,并且可以在资源监视器的“进程”部分中查看。八个进程中的每一个都显示三个线程,每个线程没有CPU操作。总CPU使用率约为12%。
我不熟悉与R的并行化。即使我简化了问题和功能,我仍然只能让程序与小列表并行运行。从我自己的阅读中,我想知道这是否是工作量分配的问题。我已经包含了.inorder = FALSE
选项来尝试解决这个问题无济于事。我相当确定这个程序是并行化的一个很好的候选者,因为它执行相同的任务数十万次并且循环不依赖于以前的值。
非常感谢任何帮助!
答案 0 :(得分:0)
我的代码也发生了类似的问题。
y= foreach(a= seq(1,500,1),.combine='rbind') %:%
foreach(b = seq(1,10,1), .combine='rbind') %:%
foreach(c = seq(1,20,1), .combine='rbind' ) %:%
foreach (d = seq(1,50,1), .combine='rbind' ) %do% {
data.frame(a,b,c,d)
}
一个非常简单的嵌套foreach并行循环,它可以执行,但不是并行样式。