我正在网格上运行一系列大型仿真。我正在逐行实施模拟,并且发现我的采样功能是一个瓶颈。我试图用foreach和doMC库来加速这个过程,但是我发现并行方法比较慢,或者我一直无法编写一个可以被foreach正确解释的函数。在R中的网格中进行大型仿真的并行化
综观其他一些帖子,看来使用的foreach我的做法可能会误导该职位我试图人数大大超过可用处理器的数量。我想知道在我的情况下,人们是否会对如何最好地实现并行化提出一些建议。我的模拟通常有两种类型。首先,我计算一个矩阵,该矩阵包含我正在处理的网格行内的每个元素的采样间隔(行)。然后使用runif进行采样(在真实模拟中,我的行包含〜9000个单元,并且我正在执行10000次模拟)。
#number of simulations per element
n = 5
#Generate an example sampling interval.
m.int1 <- matrix (seq (1, 20, 1), ncol=10, nrow=2)
#Define a function to sample over the interval defined in m.int1
f.rand1 <- function(a) {
return (runif (n, a[1], a[2]))
}
#run the simulation with each columns corresponding to the row element and rows
#the simultions.
sim1 <- round(apply (m.int1, 2, f.rand1))
在第二种情况下,我试图从一组矩阵中按列索引的经验分布中抽样。网格行元素的值对应于要采样的列。
#number of simulations per element
n = 5
#generate a vector represeting a row of grid values
v.int2 <- round(runif(10,1,3))
#define matrix of data that contains the distributions to be sampled.
m.samples<-cbind(rep(5,10),rep(4,10),rep(3,10))
f.sample <- function(a) {
return (sample (m.samples [ ,a], n,))
}
#Sample m.samples indexed by column number.
sim2<- sapply(v.int2,f.sample)
在第二个例子,我能够利用的foreach()和%dopar%并行运行,但仿真花基本上长于串行代码。在上面的第一个例子中,我无法写出一个正确的函数来利用foreach并行化。我将把我在第二种情况下使用的代码放在一起来展示我的想法 - 但现在我意识到我的方法在开销方面太昂贵了。
library(foreach)
library(doMC)
registerDoMC(2)
n = 5
#Sample m.samples indexed by column number using parallel method.
sim2.par <- foreach (i = 1 : length (v.int2),
.combine="cbind") %dopar% sample (
m.samples [ , v.int2 [i] ] , n)
我会很感激的做法提出了一些建议(和一些代码!),这将帮助我有效地利用并行。再次,我正在处理的行通常包含约9000个元素,我们正在对每个元素进行10000次模拟。所以我的输出仿真矩阵一般在10000 X 9000的数量级。感谢您的帮助。
在情况下,个人迭代短,开销可能会非常昂贵,相对来说。这就是为什么在许多内核上运行时没有看到任何提升。换句话说,工作速度如此之快,以至于沟通比实际工作花费更多时间。 – 2013-02-12 19:52:21