登录wordpress的网址,东莞网站建设优化企业,盘石 网站建设,网站开发工具 知乎本文介绍在计算机多核上通过parallel包进行并行计算。
并行计算运算步骤#xff1a;
加载并行计算包#xff0c;如library(parallel)。创建几个“workers”,通常一个workers一个核#xff08;core#xff09;#xff1b;这些workers什么都不知道#xff0c;它们的全局环…本文介绍在计算机多核上通过parallel包进行并行计算。
并行计算运算步骤
加载并行计算包如library(parallel)。创建几个“workers”,通常一个workers一个核core这些workers什么都不知道它们的全局环境没有变量也没有加载的R包所以无论你想让这些workers做什么你都需要提供相应的对象、库使用一些可以并行运行循环的函数如parApply,parLapply,parSapply。当使用完并行后端且不需要workers的时候停止它们否则它们将继续挂在内存中。
说明
1-关于并行版本的循环函数。在BaseR中提到循环有for、while用于循环的函数也有apply家族函数。相应的在并行运算中也有并行运算的apply家族函数。
library(parallel)# run this code instead to use all available CPU cores
#variable c1 is workers (clusters)
#启动workers包括确定使用的workers数量。workerscores
cl - makeCluster(detectCores()) #将当前R中的变量(这里命名为object1和object2是任何R对象)导出到新创建的workers的全局变量中以便workers使用它们。注意第一个参数是workers。
clusterExport (cl, varlist c(object1, object2))#对some.vector中的每个元素分别使用FUN作用返回结果是向量。
#parSapply函数的第一个参数是workers;
#操作类似sapply函数可先查阅saplly函数的用法。
#将返回结果存储在result对象中
result - parSapply (cl, some.vector, FUN function (i) {some.function1; some.function2})#关闭workers
stopCluster (cl)
示例
从标准正态分布中生成1e6个随机数计算这些随机数的均值这个过程重复100次。
非并行版本代码
lapply (1:100, FUN function (x) mean (rnorm (1000000)))
并行版本代码
library (parallel)
cl - makeCluster (4)
res - parLapply (cl, X 1:100, fun function (x) mean (rnorm (1000000)))
stopCluster (cl)
注意这里使用的lapply和parLapplysapply函数是lapply函数的简化版sapply函数返回的是向量lapply返回的是列表。lapply(list apply),sapply (simplifyapply).
当计算机运行上述两个函数的时候我们打开任务管理器快捷键ctrlAltDel非并行程序仅使用部分计算机容量在这个例子中非并行版本的程序仅使用了39%的CPU而并行版本的CPU为100%。 R语言的microbenchmark包来进行性能测试microbenchmark函数是microbenchmark包中的一个函数用于测量代码块的执行时间。microbenchmark函数的结果将返回一个数据框其中包含了每次执行的时间结果以及一些统计信息如平均时间、最小时间、最大时间等。这段代码的目的是通过microbenchmark函数来测试和比较不同代码块的执行时间以评估它们的性能。
mb - microbenchmark::microbenchmark ({lapply (1:100, FUN function (x) mean (rnorm (1e6)))},{library (parallel)cl - makeCluster (4L)res - parLapply (cl, X 1:100, fun function (x) mean (rnorm (1e6)))stopCluster (cl)}, times 10)
mb
运行结果 Unit: seconds
...min lq mean median uq max neval cld7.389548 7.522466 7.566548 7.585431 7.605311 7.703006 10 b2.853429 2.890022 2.954747 2.943975 2.968527 3.114184 10 a 通过两个版本程序运行时间的对比可以看到并行版本的程序的计算时间没有比非并行版本的程序快4倍因为我们使用的是4个核按照预期应该是并行版本的程序运行速度要快4倍没有达到这个预期原因是管理并行也需要花费一些时间拆分数据、将它们发送给单个workers,收集结果并将结果合并在一起。
因此并行计算适应于计算所花费的时间远高于R与单个内核通信所花费的时间。
事实上如果将计算1e6个随机数的均值增加到计算1e7个随机数的均值重复100次此时并行版本的速度将增加几乎4倍非并行83.8 vs 并行21.5.
注意除非你有一台相当强大的计算机否则不要尝试运行下面的代码因为计算机运行下面的代码需要一段时间。注意到下面的代码中将重复次数减少到了5否则需要更长的时间。 mb - microbenchmark::microbenchmark ({lapply (1:100, FUN function (x) mean (rnorm (1e7)))},{library (parallel)cl - makeCluster (4L)res - parLapply (cl, X 1:100, fun function (x) mean (rnorm (1e7)))stopCluster (cl)}, times 5)
mb Unit: seconds
...min lq mean median uq max neval cld83.08273 83.82933 83.95855 83.97395 84.39401 84.51273 5 b21.42050 21.43552 21.58001 21.49912 21.58116 21.96373 5 a 参考
Parallelization in R [David Zelený]