并行进程的通信:我都有哪些选择?
Posted
技术标签:
【中文标题】并行进程的通信:我都有哪些选择?【英文标题】:Communication of parallel processes: what are my options?并行进程的通信:我有哪些选择? 【发布时间】:2012-07-19 22:42:24 【问题描述】:我正在尝试更深入地研究 R 例程的并行化。
对于一堆关于“工作”进程的通信,我有哪些选择
-
各个工作人员之间的通信?
worker 与“master”进程的通信?
AFAIU,不存在主进程和所有工作进程都可以访问的“共享环境/共享内存”,对吧?
到目前为止,我想出的最佳想法是将通信建立在读写 JSON 文档到硬盘驱动器的基础上。这可能是个坏主意 ;-) 我选择了 .json
而不是 .Rdata
文件,因为 JSON 似乎经常用于软件间通信,所以我想采用那个“标准”。
期待了解更好的选择!
仅供参考:我通常基于基础包parallel和contrib包snowfall的函数进行并行化,主要依靠函数sfClusterApplyLB()
完成工作
编辑
我应该说我在 Windows 上运行,但也非常感谢基于 Linux 的答案/提示!
【问题讨论】:
【参考方案1】:如CRAN Task View for High-Performance Computing 中所述,Norm Matloff 的Rdsm 包提供共享内存通信。
【讨论】:
【参考方案2】:对于进程之间的通信,一个有趣的起点是帮助页面?socketConnections
和块中标记为“## Not run:”的代码。所以启动一个R进程并运行
con1 <- socketConnection(port = 6011, server=TRUE)
此进程充当服务器,侦听特定端口以获取某些信息。现在启动第二个 R 进程并进入
con2 <- socketConnection(Sys.info()["nodename"], port = 6011)
进程2中的con2与进程1上的con1建立了socket连接。回到con1,写出R对象LETTERS
writeLines(LETTERS, con1)
并在 con2 上检索它们。
readLines(con2)
因此,您无需写入磁盘即可在进程之间进行通信。这里也隐含了一些重要的概念,例如,关于阻塞与非阻塞连接,它不限于同一台机器上的通信,只要这些端口可以通过计算机所在的任何网络访问。这是parallel包中makePSOCKcluster
的基础,另外进程1实际上使用system
命令和parallel包中的脚本启动进程2。makePSOCKcluster
返回的对象是可子设置的,这样您就可以将集群的一部分用于解决特定任务。原则上,您可以安排生成的节点相互通信,而与生成的节点无关。
一个有趣的练习是使用parallel
包中的类似fork 的命令来做同样的事情(在非Windows 上)。在帮助页面?mcparallel
中有一个高级版本,例如,
p <- mcparallel(1:10)
q <- mcparallel(1:20)
# wait for both jobs to finish and collect all results
res <- mccollect(list(p, q))
但这建立在较低级别的sendMaster
和朋友之上(在mcparallel
和mccollect
源代码中达到峰值)。
Rmpi 包采用类似于 PSOCK
示例的方法,其中管理器使用脚本来生成工作人员,并使用 mpi 而不是套接字进行通信。但是,如果您有一个正常运行的 MPI 实现,那么值得一个周末项目的另一种方法是实现一个脚本,该脚本对不同的数据进行相同的计算,然后将结果整理到单个节点上,使用诸如 mpi.comm.rank
、@987654338 之类的命令@、mpi.send.Robj
和 mpi.recv.Robj
。
一个有趣的周末项目将使用并行包来实现一个涉及并行计算但不属于 mclapply 种类的工作流,例如,一个进程从网站收集数据,然后将其传递给另一个绘制漂亮图片的进程.第一个进程的输入很可能是 JSON,但 R 中的通信可能更适合 R 数据对象。
【讨论】:
以上是关于并行进程的通信:我都有哪些选择?的主要内容,如果未能解决你的问题,请参考以下文章