并行化嵌套foreach循环

问题描述 投票:0回答:1

文档提到,“并行化嵌套 for 循环时,总是存在一个要并行化哪个循环的问题。标准建议是并行化外层循环。”

但是,我没有看到任何并行化外循环然后顺序执行内循环的具体示例。在这种情况下,外层循环使用 foreach+%dopar% 内层循环使用常规 for 循环是否合适?

此外:

x <-
  foreach(b=bvec, .combine='cbind') %:%
    foreach(a=avec, .combine='c') %dopar% {
      sim(a, b)
    }

这段代码块使用了嵌套的foreach,那么是否意味着内循环和外循环都是并行的?这让我有点困惑。

我有两种解释:

  1. “从bvec中取出一个值,比如1,并迭代avec中的所有值”的任务被划分到多个线程中同时执行。那么,“从 bvec 中取 2,迭代 avec 中的所有值”的任务也被划分到多个线程中同时执行......

  2. 是否有多个线程同时执行sim(a,b)?如果是这样的话,在收集结果时岂不是会出现混乱吗? (虽然这里看起来顺序并不重要。)

哪种解释是正确的?

r foreach parallel-processing parallel.foreach
1个回答
0
投票

Q1。

%:%
本质上是将多个循环转换为单个循环,就像首先计算
bvec
avec
的完整组合,然后一次性循环。就像:

foreach(a= interaction(bvec, avec), .combine='c') %dopar% { ...}

Q2。是的,所有多个线程同时执行 sim(a, b)。

foreach
首先会定义一个
list
来存储结果,这样任何循环的结果都可以随时插入到正确的位置,并且不会有任何

“收集结果时可能会出现混乱”

© www.soinside.com 2019 - 2024. All rights reserved.