假设我有一个带有$ V $第一级节点的分层贝叶斯模型,其中$ V $非常大,我将进行$ S $模拟。我的想法是,通过并行化每个第一级节点的计算,当然还可以并行运行多个链,我可以从中受益。所以我将有两个for
或*apply
级别,多个链的并行化之一,以及一个用于特定链的迭代内的第一级节点计算的并行化。在什么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]
}
}
}
这更有意义吗?
答案 0 :(得分:2)
通常,最好在计算的最外层进行并行化,因为这样可以尽可能地避免通信开销。除非你告诉我们更多细节,否则我没有看到在两个明确的代码级别并行化的重点。
以下是一些例外情况:
当然,如果对于你的外循环,每次迭代取决于最后一次的结果,那么(很容易)可能不会这样做。
另一个需要注意的是,您需要为此高级并行化提供足够的内存,因为(可能)需要将n个数据副本保存在RAM中。
在R中,您可以使用并行BLAS(我使用OpenBLAS)进行隐式*并行化矩阵计算,它也不需要更多内存。根据BLAS完成的计算量,您可能需要调整“外部”并行化和BLAS使用的线程数。
*不对代码进行任何更改
以下是high-performance computation task view,其中概述了pacakges
就个人而言,我主要使用snow
+并行BLAS。