文档提到,“并行化嵌套 for 循环时,总是存在一个要并行化哪个循环的问题。标准建议是并行化外层循环。”
但是,我没有看到任何并行化外循环然后顺序执行内循环的具体示例。在这种情况下,外层循环使用 foreach+%dopar% 内层循环使用常规 for 循环是否合适?
此外:
x <-
foreach(b=bvec, .combine='cbind') %:%
foreach(a=avec, .combine='c') %dopar% {
sim(a, b)
}
这段代码块使用了嵌套的foreach,那么是否意味着内循环和外循环都是并行的?这让我有点困惑。
我有两种解释:
“从bvec中取出一个值,比如1,并迭代avec中的所有值”的任务被划分到多个线程中同时执行。那么,“从 bvec 中取 2,迭代 avec 中的所有值”的任务也被划分到多个线程中同时执行......
是否有多个线程同时执行sim(a,b)?如果是这样的话,在收集结果时岂不是会出现混乱吗? (虽然这里看起来顺序并不重要。)
哪种解释是正确的?
Q1。
%:%
本质上是将多个循环转换为单个循环,就像首先计算bvec
和avec
的完整组合,然后一次性循环。就像:
foreach(a= interaction(bvec, avec), .combine='c') %dopar% { ...}
Q2。是的,所有多个线程同时执行 sim(a, b)。
foreach
首先会定义一个list
来存储结果,这样任何循环的结果都可以随时插入到正确的位置,并且不会有任何
“收集结果时可能会出现混乱”