问题描述
我想加快速度较慢的 R 脚本。
我测试了两种不同的策略:
- 使用 makeForkCluster 的多线程。这种策略提高了性能,减少了执行时间。
- GPU 卸载。我正在使用 blas 库的替代品。 (nvblas)。为了注入库,我使用 LD_PRELOAD 方法。
这两种方法给我带来了很好的性能提升,但我想同时使用它们,因为 GPU 没有完全加载。
我尝试将 MT makeForkCluster 和 nvblas 一起使用。我注意到 nvblas 不会拦截来自线程的调用(由 makeForkCluster 分叉)。
我不明白为什么会发生这种情况,如果我从 makeForkCluster 切换到 makeCluster 它可以工作。但是我想使用 Fork 方法(不需要序列化)。
示例代码:
library(foreach)
library(parallel)
ncpus = 10
N = 20
#cl <- parallel::makeForkCluster(ncpus,outfile="")
cl <- parallel::makeCluster(ncpus,outfile="")
doParallel::registerDoParallel(cl)
test = function(i){
message("started",i)
ORDER = 8*(2^i)
A = matrix(rnorm(ORDER^2),nrow=ORDER)
B = matrix(rnorm(ORDER^2),nrow=ORDER)
cputime = system.time({C = A %*% B})[3]
message("completed",i)
return(cputime)
}
foreach(i = 1:N,.combine = 'c') %dopar% {
test(i)
}
您有什么建议吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)