2013-09-28 36 views
1

我嘗試了3臺不同的計算機上執行局域網與下述R代碼中的MPI集羣:的R - 錯誤RMPI雪

library(plyr) 
library(class) 
library(snow) 
cl <- makeCluster(spec=c("localhost","ip1","ip2"),master="ip3") 

,但我得到一個錯誤:

Error in mpi.comm.spawn(slave = mpitask, slavearg = args, nslaves = count, : 
    Calloc could not allocate memory (18446744071562067968 of 4 bytes) 
Warning messages: 
1: In if (nslaves <= 0) stop("Choose a positive number of slaves.") : [...] 
2: In mpi.comm.spawn(slave = mpitask, slavearg = args, nslaves = count, : 
    NA produced by coercition 

這個錯誤是由什麼引起的?我無法找到有關當前主題的任何相關主題。

回答

4

當調用makeCluster來創建MPI集羣時,參數spec應該是數字或缺失,具體取決於是否要生成工作人員。您不能像創建SOCK羣集時那樣指定主機名。爲了在其他機器上啓動具有MPI羣集的工作人員,您必須使用mpirun,mpiexec等命令執行您的R腳本,具體取決於您的MPI安裝,並且您可以通過參數指定要使用的主機以mpirun ,不是makeCluster

在你的情況,你可能會執行你的腳本:

$ mpirun -n 1 -H ip3,localhost,ip1,ip2 R --slave -f script.R 

由於-n 1時,你的腳本執行只在「IP3」,不是所有的四臺主機,但MPI知道其他三臺主機,並能夠爲他們產生進程。

您將創建MPI集羣與該腳本:

cl <- makeCluster(3) 

這應當引起在「localhost」,「IP1」和「IP2」將催生一個工人,與主進程上運行「ip3」(至少在Open MPI中:我不確定其他MPI發行版)。我不相信「主」選項與MPI傳輸一起使用:它主要由SOCK傳輸使用。您可以從手冊頁得到關於mpirun的信息

0

,你甚至可以嘗試按照執行在羣集節點代碼:

  1. 與名稱創建一個文件 節點列表 - >寫下一個低於其他內部計算機名稱。

  2. 使用mpirun在終端中嘗試以下命令: mpirun -np (no.of processes) -machinefile (path where your nodelist file is present) Rscript (filename.R)。忽略圓括號。

  3. 默認情況下,它會將第一個節點作爲主節點,並將該進程產生到其餘節點,包括自己作爲從節點。