foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?
Posted
技术标签:
【中文标题】foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?【英文标题】:foreach %dopar% uses sequential worker setup with PSock cluster? 【发布时间】:2012-12-21 09:32:12 【问题描述】:问题
我注意到 foreach/%dopar% 在并行执行任务之前执行顺序,而不是并行设置集群。如果每个工作人员都需要一个数据集,并且将数据集传输给工作人员需要 N 秒,那么 foreach/%dopar% 将花费#workers * N seconds
of setup 时间。这对于大量工作人员或大量 N(要传输的大型数据集)来说可能很重要。
我的问题是这是设计使然,还是我在 foreach 或集群生成中缺少某些参数/设置?
设置
R 2.15.2 截至今天(2013 年 1 月 7 日)的 foreach/parallel/doParallel 的最新版本 Windows 7 x64示例
library( foreach )
library( parallel )
library( doParallel )
# lots of data
data = eval( rnorm( 100000000 ) )
# make cluster/register - creates 6 nodes fairly quickly
cluster = makePSOCKcluster( 6 , outfile = "" )
registerDoParallel( cluster )
# fire up Task Manager. Observer that each node recieves data sequentially.
# When last node gets data, then all nodes process at the same time
results = foreach( i = 1 : 500 ) %dopar%
print( data[ i ] )
return( data[ i ] )
【问题讨论】:
“顺序设置”是我在不使用共享内存集群的情况下遇到的唯一一种行为。如果有一种方法可以在没有共享内存的情况下加快速度,我也会非常感兴趣。但是,由于clusterExport()
(通过clusterCall()
)是按顺序执行的,我想在那之前我不会屏住呼吸。
Ben - 你能详细说明一下吗?请原谅我对与操作系统/内存相关的事情的无知……在示例中,有 6 个子进程,我认为有机会并行向它们发送数据。是不是父进程只能按顺序访问该内部数据?
这已经接近我对集群通信知识的局限了,但是在类似unix的系统上,可以fork
一个进程,允许子进程访问父进程中加载的对象,只能复制那些被修改的。 Windows 机器不具备这种特殊功能,并且对于我使用过的所有集群类型(不是全部),集群设置都是按顺序进行的。
本 - 谢谢!希望有人插话并行执行此操作的可能性。或者您观察到这一直是连续的,也许是因为没有其他方法可以做到这一点。
【参考方案1】:
感谢Revolution Computing 的Rich 提供帮助......
clusterCall
使用 for 循环向每个工作人员发送数据。因为 R 不是多线程的,所以 for 循环必须是顺序的。
有一些解决方案(需要有人编写代码)。 R 可以调用 C/C++ 来线程化 worker 设置。或者工作人员可以从磁盘上的文件中提取数据。或者,worker 可以在同一个套接字上侦听,master 可以只向套接字写入一次,然后将数据广播给所有 worker。
【讨论】:
感谢您发布回复!以上是关于foreach %dopar% 使用带有 PSock 集群的顺序工作程序设置?的主要内容,如果未能解决你的问题,请参考以下文章
为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?
R:在 foreach %dopar% 中显示错误和警告消息
使用 foreach 进行并行处理时出错:“找不到函数“%dopar%””
如何在 R 中将“foreach”和“%dopar%”与“R6”类一起使用?