­

R語言實現並行計算

  • 2019 年 12 月 19 日
  • 筆記

Python作為多執行緒的程式語言在並行方面相對於R語言有很大的優勢,然而作為佔據統計分析一席之地的R語言自然不能沒有並行計算的助力。那麼我們來看下在R語言中有哪些並行的包:隱式並行:OpenBLAS,Intel MKL,NVIDIA cuBLAS等;顯性並行:parallel(主打lapply應用)、foreach(主打for循環)、SupR、還有利用GPU的辦法(gpuR)。所謂顯式並行也就是基於並行的程式語言編譯的程式;隱式並行是基於串列程式編譯的並行計算。當然,在R語言核心功能中也是帶有了相關的並行的計算基礎包parallel。今天就給大家介紹下這個基礎並行包的具體應用。

我們不需要再安裝這個包,可以直接進行相關的計算。首先我們看下裡面的幾個核心的函數:

1. detectCores() 發現PC終端有多少個核。所謂核就是CPU的性能體現,越多越好。實例:

library(parallel)cl.cores <- detectCores()#發現可用核數

2. makeCluster() 初始化我們需要用到的核數。其中type參數有兩種PSOCK適用所有作業系統,FORK適用unix/max,實現記憶體共享以及節省記憶體。實例:

cl <-makeCluster(getOption("cl.cores", 2),type="PSOCK")

3. clusterExport() 將變數載入並行的環境中。實例:

xx=1:10clusterExport(cl, "xx")#讀入變數數據

4. clusterEvalQ(,{code}) 將包或者程式碼直接載入並行環境。實例:

clusterEvalQ(cl,{library(ggplot2);xy=1:10})
clusterCall(cl, function(y) xy + y, 2:10)

5. clusterCall() 在並行環境中,一次運行過程在各節點的值。clusterMap便可以直接運行所用的值,並以列表形式展示所有結果。實例:

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

clusterMap(cl,function(y) xx + y,2:10)

6. parLapply(), parSapply(), 和 parApply() 和函數 lapply, sapply 及 apply一一對應。可以直接將自定義的函數引入並行環境。實例:

parSapply(cl,2:10, function(y) xx + y)

7. clusterApply() 類似parLapply 系列,可以直接運行得到所有結果,輸出列表格式。clusterApplyLB()便是對其的優化,具體的優化模式我們就不贅述了。實例:

clusterApply(cl,2:10, function(y) xx + y)

8. do.call() 針對某個數據集執行指定的函數功能。實例:

res=clusterApply(cl,2:10, function(y) xx +y)do.call('rbind',res)

9. stopCluster() 關閉集群。實例

stopCluster(cl)

以上便是parallel包的全部功能函數,其實並行真正解決的是重複性工作的情況,在P值的計算中應用比較廣泛。然而對於遞歸計算需要一定的優化才能使用並行計算,不然不一定有單機的效率高。