R语言实现并行计算[parallel,Rdsm]

R语言实现并行计算[parallel,Rdsm]

最近在R中的学习并行计算
整个人被各种函数整的头都大了
所以准备专门写一条博文来总结
所谓R中的并行无非是
snow包multicore包和foreach包
但很遗憾的是只有第一个能够在win下运行
辅助并行计算的共享内存包rdsm也只能在linux或者macos上运行

然而在macos上安装r和rstudio是十分痛苦的
说实话碰到了装成日文版等等各种问题
最后还是没有解决rstudio无法运行的结果,故只能在r中调试
如果有大佬解决了相关情况希望也ballball孩子
(console不可以通过,terminal可以通过)
最终所有实验还是在ubuntu上做的

话不多说,在r语言中parallel包里

parallel包

创建一个两个线程的集群:

cls<-makeCluster(2)

当然使用完毕需要释放这个集群:

stopCluster(cls)

将”lnks”变量分享给整个cls集群:

clusterExport(cls,”lnks”)

同理将函数function分享给整个cls集群:

clusterEvalQ(cls,function)

在这里要介绍一下:

R语言提供了批量处理函数,可以循环遍历某个集合内的所有或部分元素,以简化操作。
当然这个批处理也有并行计算包中的批处理函数。
但我们先插入介绍一下原本的批处理函数
这些函数底层是通过C来实现的,所以效率也比手工遍历来的高效。
批量处理函数有很重要的apply族函数:lapply sapply apply tapply mapply。apply族函数是高效能计算的运算向量化(Vectorization)实现方法之一,比起传统的for,while常常能获得更好的性能。

a

pply : 用于遍历数组中的行或列,并且使用指定函数来对其元素进行处理。
lapply : 遍历列表向量内的每个元素,并且使用指定函数来对其元素进行处理。返回列表向量。
sapply : 与lapply基本相同,只是对返回结果进行了简化,返回的是普通的向量。
mapply: 支持传入两个以上的列表。 
tapply: 接入参数INDEX,对数据分组进行运算,就和SQL中的by group一样。

而对于并行计算parallel包中也有相应的包

我们有几种调度模式,以此来减少通信开销:
1.通过直接给线程发送已经分好的任务量

ichunks<-clusterSplit(cls,1:n))

这个其实就是按照数目给把1:n号基本均分给各个cls,生成一个任务列
2.通过轮转调度每个任务,A-1 B-2 A-3 B-4这种调度

clusterApply(集群,任务列(数目),处理函数,处理函数所需要的参数)
示例:
clusterApply(cls,tasks,dochunk,x,y,allcombs,chunksize)
 cls :snow cluster
x: predictor matrix,one column corresponds to a predictor
y:respons vector
allcombs: genallcombs(p,k)
chunksize:size of chunks
dochunk<-function(psetstart,x,y,allcombs,chunksize)

3.但是上方的函数处理非常的不合算,因为单纯的轮转可能导致最终计算结果太慢
举个例子:线程1接到两个需要做半个小时的任务,线程二接到俩个需要做十分钟的任务
这显然是不合算的

这时候就出现了自动调度并行计算函数

clusterApplyLB(cls,tasks,function,parameters)

当然谈到并行计算,就不得不考虑通信开销
此时就需要Rdsm包这种能够分配共享内存空间的包
谈到临界区,就逃不了锁和屏障,这个不详细解释,可以去了解一下操作系统

屏障是用来同步全部线程的
这个函数为

barr()

和c程序中的MPI_Barrier如出一辙

在这个包中:

myinfo$nwrkrs线程个数
myinfo$id当前线程id

这两个东西相当于常量
但是只有线程在运作的时候才能使用

mgrinit(cls)初始化Rdsm包系统

中间放你用parallel开的集群

mgrmakevar(cls,”varname”,nrow,ncol)在共享内存中创建变量

用snow包中的

clusterEvalQ(cls,function)来开始线程

在这个包中也有一个如clusterSplit()的分开函数

getidxs(n)即将1到n根据线程数量分为若干段

总之描述上如上
想要仔细的了解还需要多多写程序
希望有所帮助

你可能感兴趣的:(计算机,R)