除非另有特别说明,否则 R 会话是否总是使用一个 CPU 核心?

Do R sessions always use one CPU core unless specifically instructed otherwise?

在需要大量计算的情况下,我使用 doParallel 包在多个内核上分派工作。随机示例:

  if (detectCores()-1 > 1) {
    cl <- makeCluster(detectCores()-1)
    registerDoParallel(cl)

    tdm <- DocumentTermMatrix(corpus, control = list(dictionary = Terms(tdm), removePunctuation = TRUE, stopwords = TRUE, stemming = TRUE, removeNumbers = TRUE)) 

    stopCluster(cl)
  }

但是我写的广大大多数(大概99.5%)R代码是不是 包裹在额外的代码中,这些代码明确地将工作分散到 >1 个核心上。

假设此代码 运行ning 跨 1 个单核是否公平?或者回答这个问题需要深入研究每个使用的库及其功能(例如 tidyversedata.table 等)?

注:除了一些定时实验外,本人对R与硬件的交互了解不多,如有理解有误(如假设错误),请指出。

背景

之所以如此有趣,是因为它有助于决定在更高时钟速度下使用较少内核还是在较低时钟速度下使用更多内核;所有 la 最新的 macbook。不幸的是,为 'better' 处理器支付更多费用,只会让大多数日常 R 任务 运行 由于时钟速度较慢而变慢(假设它们是 运行ning仅在一个核心上)。

从我们刚刚在另一个地方进行的 Slack 讨论中复制并粘贴:

  • 这有点不对/视情况而定/可能观点太狭隘了。

  • 对于初学者来说,R 本身甚至使用了一点 OpenMP(在它可以的平台上)。

  • 接下来,您可以选择并行执行所有矩阵数学运算的 BLAS。

  • 接下来是可以多线程且经常是的客户端代码;包 data.table 是一个伟大 和著名的例子。

  • 也许(至少对我来说)也很重要:如果我在我的六核台式机上设置 options("Ncpu"=6),我将 install.packages() 并行安装六个包。

  • make -j ...

    也一样

我在此 arXiv preprint now out in this (paywalled) WIREs article.

中对 R 和并行计算(在不同级别)多说了一点

现在,最后,你说 macOS。这对 OpenMP 有许多其他困难,您应该仔细阅读 r-sig-mac 列表和其他 repo(同样,data.table 涵盖了这些)。我不使用 macOS 所以我不能说更多---除此之外我看到很多人有问题。

最后,当然,不要放弃它:是的,R 的内部解释器是单线程的,并且会一直如此。但这并不意味着我们应该冲出单核计算机。您将从更多内核中获得 一些 好处,但具体 多少 主要取决于工作负载。