R语言实现并行计算

2019-12-19 19:25:31 浏览数 (1)

Python作为多线程的编程语言在并行方面相对于R语言有很大的优势,然而作为占据统计分析一席之地的R语言自然不能没有并行计算的助力。那么我们来看下在R语言中有哪些并行的包:隐式并行:OpenBLAS,Intel MKL,NVIDIA cuBLAS等;显性并行:parallel(主打lapply应用)、foreach(主打for循环)、SupR、还有利用GPU的办法(gpuR)。所谓显式并行也就是基于并行的编程语言编译的程序;隐式并行是基于串行程序编译的并行计算。当然,在R语言核心功能中也是带有了相关的并行的计算基础包parallel。今天就给大家介绍下这个基础并行包的具体应用。

我们不需要再安装这个包,可以直接进行相关的计算。首先我们看下里面的几个核心的函数:

1. detectCores() 发现PC终端有多少个核。所谓核就是CPU的性能体现,越多越好。实例:

代码语言:javascript复制
library(parallel)cl.cores <- detectCores()#发现可用核数

2. makeCluster() 初始化我们需要用到的核数。其中type参数有两种PSOCK适用所有操作系统,FORK适用unix/max,实现内存共享以及节省内存。实例:

代码语言:javascript复制
cl <-makeCluster(getOption("cl.cores", 2),type="PSOCK")

3. clusterExport() 将变量载入并行的环境中。实例:

代码语言:javascript复制
xx=1:10clusterExport(cl, "xx")#读入变量数据

4. clusterEvalQ(,{code}) 将包或者代码直接载入并行环境。实例:

代码语言:javascript复制
clusterEvalQ(cl,{library(ggplot2);xy=1:10})
代码语言:javascript复制
clusterCall(cl, function(y) xy   y, 2:10)

5. clusterCall() 在并行环境中,一次运行过程在各节点的值。clusterMap便可以直接运行所用的值,并以列表形式展示所有结果。实例:

clusterCall(cl, function(y) xx y, 2:10)

代码语言:javascript复制
clusterMap(cl,function(y) xx   y,2:10)

6. parLapply(), parSapply(), 和 parApply() 和函数 lapply, sapply 及 apply一一对应。可以直接将自定义的函数引入并行环境。实例:

代码语言:javascript复制
parSapply(cl,2:10, function(y) xx   y)

7. clusterApply() 类似parLapply 系列,可以直接运行得到所有结果,输出列表格式。clusterApplyLB()便是对其的优化,具体的优化模式我们就不赘述了。实例:

代码语言:javascript复制
clusterApply(cl,2:10, function(y) xx   y)

8. do.call() 针对某个数据集执行指定的函数功能。实例:

代码语言:javascript复制
res=clusterApply(cl,2:10, function(y) xx  y)do.call('rbind',res)

9. stopCluster() 关闭集群。实例

stopCluster(cl)

以上便是parallel包的全部功能函数,其实并行真正解决的是重复性工作的情况,在P值的计算中应用比较广泛。然而对于递归计算需要一定的优化才能使用并行计算,不然不一定有单机的效率高。

0 人点赞