【问题标题】:CPU usage when using foreach in R在 R 中使用 foreach 时的 CPU 使用率
【发布时间】:2017-08-18 20:43:42
【问题描述】:

我在 R 中使用 foreach 进行并行计算,

no_cores <- detectCores() 
registerDoParallel(no_cores)

    temp <- foreach(i=320:530,
                              .combine = rbind) %dopar% {
                                track(data = data[i,], para = currenttime)
                              }

但我意识到有些 CPU 内核没有被使用,更不用说完全使用了。

我错过了一些设置吗? 有没有一些我想提高使用率来加速运行的解决方案?

【问题讨论】:

  • 按行访问数据效率很低,因为它们是按列存储的。顺便说一句,如果您的示例无法重现,我们将无法为您提供太多帮助。

标签: r foreach parallel-processing parallel.foreach parallel-foreach


【解决方案1】:

对此的一些想法:

  • 您可能只有 4 个物理核心,但有 8 个逻辑核心,因为您的计算机上启用了超线程。你的问题可能只能用好4核。如果是这样,你可能会通过启动 8 个工人来获得更差的性能。在这种情况下,最好使用:

    no_cores &lt;- detectCores(logical=FALSE)

  • track 可能不是非常密集的计算,可能是由于过多的 I/O 或内存操作,导致它使用的 CPU 时间不多。

  • 1234563 .

可能的解决方案:

  • 使用计算机的进程监控工具验证您的计算机是否有足够的内存来支持您启动的工作人员。如有必要,减少工作人员的数量以保持在您的资源范围内。

  • 使用分块技术可能会获得更好的结果,因此每个工作人员只有一个任务。这使工作人员更有效率,并减少了主人完成的后处理。

  • 尝试使用foreach 选项,例如.maxcombine。将其设置为大于任务数可能会有所帮助。

  • 按行组合结果不如按列组合效率高,但如果是分块,这可能不是问题。

【讨论】:

  • 谢谢,史蒂夫。正如你所说,它确实有4个核心。但是为什么在这里使用 8 核会使情况变得更糟?
  • 对于.maxcombine选项,我应该设置它大于循环数吗?
  • @Gamp 最好运行基准测试来尝试确定最佳工作人员数量,但启动过多工作人员可能是一个问题,因为它需要操作系统调度程序来上下文切换您的进程,这可能会导致例如,内存缓存的使用效率低下。
  • @Gamp 如果 .maxcombine >= 循环迭代次数,那么 combine 函数只会被调用一次,需要更多内存,但效率更高。
猜你喜欢
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多