什么R并行化/HPC包允许在循环内进行并行化?

什么R并行化/HPC包允许在循环内进行并行化?,r,parallel-processing,R,Parallel Processing,假设我有一个带有$V$一级节点的层次贝叶斯模型,其中$V$非常大,我将进行$S$模拟。我的想法是,我可以通过并行化每个第一级节点的计算,当然也可以通过并行运行多个链来获益。因此,对于或*应用级别,我有两个,一个是多个链的并行化,另一个是特定链迭代中第一级节点计算的并行化。在哪些R包(如果有)中,这是可能的?多谢各位 根据要求,下面是一些我想做的事情的高级伪代码: for node in top.cluster { for draw in simulation { draw

假设我有一个带有$V$一级节点的层次贝叶斯模型,其中$V$非常大,我将进行$S$模拟。我的想法是,我可以通过并行化每个第一级节点的计算,当然也可以通过并行运行多个链来获益。因此,对于或*应用级别,我有两个
,一个是多个链的并行化,另一个是特定链迭代中第一级节点计算的并行化。在哪些R包(如果有)中,这是可能的?多谢各位

根据要求,下面是一些我想做的事情的高级伪代码:

for node in top.cluster {
    for draw in simulation {
        draw population.level.variables from population.level.conditionals
        for node in bottom.cluster {
            draw random.effect[node] from random.effect.conditionals[node]
        }
    }
}

这更有意义吗?

一般来说,最好在计算的最外层进行并行化,以尽可能避免通信开销。除非您告诉我们更多的细节,否则我看不出在两个显式的代码级别上进行并行化有什么意义

以下是一些例外情况:

  • 当然,如果对于外部循环,每次迭代都取决于最后一次迭代的结果,那么这不太可能(容易)

  • 另一个警告是,您需要有足够的内存来实现这种高级并行化,因为(可能)n个数据副本需要保存在RAM中

  • 在R中,您可以通过使用并行BLAS(我使用OpenBLAS)隐式地*并行化矩阵计算,这也不需要更多内存。根据BLAS完成的计算量,您可能需要调整“外部”并行化和BLAS使用的线程数。
    *不需要对代码进行任何更改


下面是一个示例,它为您提供了打包的概述


就我个人而言,我主要使用
snow
+并行BLAS。

也许你可以添加一些伪代码来更清楚地说明你想做什么。我添加了一些伪代码,@matteofasiolotthanks现在更清楚了。我完全同意cbeleites下面的回答。特别是,如果$V$很大,我将使用该级别的所有可用内核,并在每个节点内按顺序执行操作。如果您没有耗尽内存,那么这将为您提供最佳性能。我使用R中包含的“parallel”包。如果您是linux用户,那么函数“mclappy”的使用非常简单,否则您必须创建一个集群,将数据导出到每个节点,并将其传递给“parlappy”函数。