当前位置:天才代写 > tutorial > 其他教程 > [无所不包的R]多核计较multicore package

[无所不包的R]多核计较multicore package

2017-12-04 08:00 星期一 所属: 其他教程 浏览:1012

跟我之前先容过的snowfall纷歧样,multicore这个包专注于做好单机多核并行这个简朴而又常用的成果。这是我用过的R里最便捷的单机多核并行东西,因为它的并行化跟向量化计较细密相连,而R又是天然的向量化平台,所以一切计较往并行计较的迁移都很顺理成章。multicore的一个突出特点是历程间共享事情区,所以不需要再为新的历程初始化事情区,大大加速了历程建设与初始化速度。


主要的几个顶层应用函数:

  • mclapply——lapply的并行版本

  • pvec——对向量化函数的并行

  • parallel与collect——并行地执行R语句,并收集返回功效。只读时共享事情区,写数据时遵循copy-on-write原则。

  • 手册例子:mclapply对lapply的并行及计较增益


    lapply是一个天然可并行的函数,mclapply可以把它的计较分派到多个核举办计较,还特别提供了几个参数:

  • mc.preschedule:TRUE暗示按照core的数量事先把任务均分,然后分配到各个子历程;FALSE暗示为每一个任务及时发生子历程。前者合用于任务数量较量多,而每个任务计较差别不大的环境;后者合用于任务量不多,但各个任务计较劲差别较量大的环境。

  • mc.set.seed:随机数产生器的初始值。TRUE暗示每个子历程均自行初始化随机数种子,FALSE暗示每个子历程利用一样的随机数种子。

  • mc.cores:利用核的数量,默认为利用所有可用的核。

  • 以下是一个来自manual的例子,比拟了lapply与mclapply的效率。

    > system.time(unlist(mclapply(1:32, function(x) sum(rnorm(1e7)))))
    user system elapsed
    75.625 2.252 12.466
    > system.time(unlist(lapply(1:32, function(x) sum(rnorm(1e7)))))
    user system elapsed
    73.972 2.304 76.282

    一般的向量化运算及pvec,mclapply


    pvec的成果与mclapply雷同,但更为特化,只针对付向量化函数举办操纵,所谓向量化的函数,意指它以一个向量为输入,并获得一个沟通长度的向量作为输出,而且c(FUN(x[i]), FUN([j]))==FUN(x[c(i,j)]),所以pvec实质是把一个向量化运算支解为多个向量化运算来做。而mclapply可以对任意的FUN举办操纵,并对每一个数据应用FUN函数。因为利用了向量化运算,pvec的效率会比mclapply高不少,假如利用不妥,mclapply也许会比一般的向量化函数还慢,如下面的例子。

    > dates <- sprintf(‘%04d-%02d-%02d’, as.integer(2000+rnorm(1e5)),as.integer(runif(1e5,1,12)), as.integer(runif(1e5,1,28)))

    > system.time(a <- as.POSIXct(dates))
    user system elapsed
    0.692 0.180 0.872
    > system.time(b <- pvec(dates, as.POSIXct))
    user system elapsed
    0.620 0.956 0.382
    > system.time(c <- unlist(mclapply(dates, as.POSIXct)))
    user system elapsed
    79.517 1.900 18.888


    所以,

  • 假如有系统已经优化好的向量化函数,利用pvec来并行;

  • 假如没有,而且可以现成套用lapply的模式,利用mclapply来实现;

  • 操作底层语言来实现向量化函数或编写lapply中的FUN函数的焦点部门是可取的;

  • 每个子任务的计较劲越大,越适适用于并行,反之则否则。
  •  

      关键字:

    天才代写-代写联系方式