【发布时间】:2018-09-24 05:55:01
【问题描述】:
注意:我已将问题修复到我的代码现在将运行的位置,但我不知道为什么此解决方案有效。任何反馈都很棒。请参阅下面的编辑。
我遇到了并行包的问题,我认为是 data.table。昨晚,我的代码运行良好。但是,现在我收到此错误:
Error in unserialize(node$con) : error reading from connection.
除了同样的断言失败,重复 no_core 次,其中 no_cores 是我在集群中使用的核心数:
Assertion failure at kmp_runtime.cpp(6480): __kmp_thread_pool == __null.
OMP: Error #13: Assertion failure at kmp_runtime.cpp(6480).
OMP: Hint: Please submit a bug report with this message, compile and run commands used, and machine configuration info including native compiler and operating system versions. Faster response will be obtained by including all program sources.
自从我的代码昨晚工作以来,我倾向于认为我已经库的一些包组合允许我的代码工作,因为我试图使用多个包来进行一些数据操作。但是现在我的代码不再需要这些包,所以我的代码中没有包含“library()”语句。
我正在使用并行包来提高重复调用模拟分布时刻的函数的速度。我正在调用的函数使用 data.table 来估计这些时刻。以下是我认为相关的所有代码,并且与我的实际脚本顺序相同。
library(data.table)
library(parallel)
Rcpp::sourceCpp('mycppcode.cpp')
nsim=100
no_cores = detectCores()-1
objective_fun = function(theta_guess, dmoments = data_moments){
set.seed(100)
moment.list = parLapply(cl,1:nsim,function(x) {est.moments(theta_guess)})
moment.mat = matrix(unlist(moment.list),ncol=nsim)
mean.moments = apply(moment.mat,1,mean)
outval = as.numeric(t(mean.moments-dmoments)%*%(mean.moments-dmoments))
outval
}
cl = makeCluster(no_cores,type = "FORK")
test = constrOptim(guess,objective_fun,grad=gradient_obj,
ui=diag(11),ci=rep(0,11),method = "BFGS")
est.moments 函数使用 data.table 计算复杂的均值和方差。我只是真正使用 data.table()、setkey() 和 merge()。
是的,我在定义目标函数后制作集群。我可能做错了,因为我对并行包相对较新。
唯一值得一提的是,我也在使用 Rcpp 来制作某些功能,尽管 C++ 代码可以自行编译和运行。
编辑:如果我在代码的最开始创建一个集群,然后在最后停止它,然后重新创建它,我的代码运行良好。我做错了什么?
library(data.table)
library(parallel)
Rcpp::sourceCpp('mycppcode.cpp')
nsim=100
no_cores = detectCores()-1
cl = makeCluster(no_cores,type = "FORK")
objective_fun = function(theta_guess, dmoments = data_moments){
set.seed(100)
moment.list = parLapply(cl,1:nsim,function(x) {est.moments(theta_guess)})
moment.mat = matrix(unlist(moment.list),ncol=nsim)
mean.moments = apply(moment.mat,1,mean)
outval = as.numeric(t(mean.moments-dmoments)%*%(mean.moments-dmoments))
outval
}
stopCluster(cl)
cl = makeCluster(no_cores,type = "FORK")
test = constrOptim(guess,objective_fun,grad=gradient_obj,
ui=diag(11),ci=rep(0,11),method = "BFGS")
注意:我删除了会话信息,因为我觉得它不再相关。
【问题讨论】:
标签: r parallel-processing data.table