在R中使用“并行处理”;平行;包-不可预测的运行时

在R中使用“并行处理”;平行;包-不可预测的运行时,r,parallel-processing,cpu-cores,mclapply,R,Parallel Processing,Cpu Cores,Mclapply,我一直在学习使用parallel包,特别是mclappy()函数和14核,在R中并行化代码 从几次代码运行中,我注意到重复调用mclappy()(使用相同的参数和相同数量的内核)所需的时间长度明显不同。例如,当我背靠背地(在相同的输入上)运行时,第一次运行需要18秒,下一次运行需要23秒,下一次运行需要34秒。所以我等了一分钟,再次运行代码,它又回到了18秒 在运行代码后是否存在类似于“计算机需要一秒钟来冷却”的情况,这意味着背对背运行单独的mclappy()调用可能会花费越来越长的时间,但等待

我一直在学习使用
parallel
包,特别是
mclappy()
函数和14核,在R中并行化代码

从几次代码运行中,我注意到重复调用
mclappy()
(使用相同的参数和相同数量的内核)所需的时间长度明显不同。例如,当我背靠背地(在相同的输入上)运行时,第一次运行需要18秒,下一次运行需要23秒,下一次运行需要34秒。所以我等了一分钟,再次运行代码,它又回到了18秒

在运行代码后是否存在类似于“计算机需要一秒钟来冷却”的情况,这意味着背对背运行单独的
mclappy()
调用可能会花费越来越长的时间,但等待一分钟左右,然后再次运行
mclappy()
会让它恢复正常

我对R中的并行化没有太多经验,但这是我能想到的唯一特别的解释。如果知道我的推理是否正确,并听到更多关于为什么会发生这种情况的细节,这将非常有帮助。谢谢

澄清一下,我的电话如下:

RNGkind("L'Ecuyer-CMRG")
set.seed(1)    
x <- mclapply(training_data, simulation, testing_data, mc.cores=14, mc.set.seed = TRUE)
RNGkind(“L'Ecuyer-CMRG”)
种子(1)

x我没有使用mcapply,但我使用了parallel、foreach和pbapply软件包。我认为不一致的地方在于,解雇工人和就并行运行任务的进度进行沟通时涉及的开销很小。

在R中使用并行工作的运行时可以基于很多因素,包括数据大小,因为R需要在进程之间序列化和传输数据;如果不是小的,那就很重要了。此外,您不会说您是否正在重新启动集群,或者集群是否在每次重新应用
mclappy(.)
;如果集群是持久的,并且每个节点中的数据都是非平凡的,那么垃圾收集可能是一个因素。(我假设主机操作系统是空闲的。)感谢您的帮助,@r2evans-我的集群通过重新应用是持久的。但是,如果垃圾正在收集,那不是意味着我一分钟后的跑步也需要更长的时间吗?当我让它在函数调用之间冷却一分钟时,计时就会恢复正常。垃圾收集不是一个可预测的事件(除非您手动触发它,这通常是不必要的)。坦率地说,我不知道这是个问题,但它可能导致运行时不一致,这就是为什么基准测试工具经常受到虚假的“max”值的影响(例如,请参见
bench
的垃圾收集计数:)如果触发垃圾回收器,即调用
gc()
,是否会产生影响,就在您的
mclappy()
之前?顺便说一句,不,除了垃圾收集之外,没有所谓的“冷却”需求。我不一定知道在相同输入上运行相同代码之间,这些开销会发生什么变化。你能澄清一下吗?