R 为什么要增加“的数量?”;“核心”;有区别吗?

R 为什么要增加“的数量?”;“核心”;有区别吗?,r,foreach,parallel-processing,R,Foreach,Parallel Processing,我不熟悉并行计算的概念 (我试图将其应用于一个脚本,在该脚本中,一个循环构建了几个回归模型约1000次,每次都基于这些模型的系数进行预测。每种情况下的数据集都太大,并且模型涉及虚拟代码和权重,这会进一步减慢过程。因此,我尝试将其应用于每个仪器。)“for”循环的广告。) 我正在尝试使用doParallel和foreach库,并使用registerDoParallel()设置内核数。我有一台Windows 10机器。我的理解是,这会调用detectCores()和 Sys.getenv(“处理器的

我不熟悉并行计算的概念

(我试图将其应用于一个脚本,在该脚本中,一个循环构建了几个回归模型约1000次,每次都基于这些模型的系数进行预测。每种情况下的数据集都太大,并且模型涉及虚拟代码和权重,这会进一步减慢过程。因此,我尝试将其应用于每个仪器。)“for”循环的广告。)

我正在尝试使用
doParallel
foreach
库,并使用
registerDoParallel()
设置内核数。我有一台Windows 10机器。我的理解是,这会调用
detectCores()
Sys.getenv(“处理器的数量”)
将返回“逻辑处理器”的数量,而不是核心的数量:

> detectCores()
  [1] 4
我的任务管理器显示了这些规范

我试着用我应该设置的
registerDoParallel()
核心的“正确”(?)数量进行了一点实验,并意识到它可以接受任何数量。我进一步进行了实验,发现这甚至会产生不同。我已经从这两个的创建者那里改编了上面的脚本(第3页)比较不同数量内核的串行到并行执行

x <- iris[which(iris[,5] != "setosa"), c(1,5)]
trials <- 10000

library(foreach)
library(doParallel)

#detectCores()
#Sys.getenv('NUMBER_OF_PROCESSORS') 
registerDoParallel(cores = 4)
getDoParWorkers()

ptimes = numeric(15)
stimes = numeric(15)

for (i in 1:15) {
stime <- system.time({
  r <- foreach(icount(trials), .combine=cbind) %do% {
    ind <- sample(100, 100, replace=TRUE)
    result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
    coefficients(result1)
  }
})[3]
stimes[i] = stime
}

for (i in 1:15) {
ptime <- system.time({
  r <- foreach(icount(trials), .combine=cbind) %dopar% {
    ind <- sample(100, 100, replace=TRUE)
    result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
    coefficients(result1)
  }
})[3]
ptimes[i] = ptime
}

x实际上,设置与计算线程相同数量的硬件核心(物理核心,在您的示例中为2个)会很好


更多详情:

如果您的工作负载是计算密集型的,则会有更多的线程(比硬件内核大)将竞争资源并降低性能。但是,在某些情况下,例如您的示例,工作负载要求每次计算都有大量内存访问,因此更多线程隐藏内存延迟会有好处。实际上,CPU是面向延迟的,它可以自动隐藏延迟。在您的情况下,超过2个线程可以获得进一步的改进,但不会太多

因此,与每次运行时不同系统上的调优时间(应该使用多少线程)相比,在并行计算程序中使用#个硬件内核会更好


关于使用R in的并行计算的一个很好的介绍。

如果我告诉你,使用像Revolution R这样的优化发行版可以在不使用任何工人的情况下将性能提高四倍,那会怎么样?在四元机上,大型阵列上的
svd运行速度要快7倍,因为函数本身使用SIMD命令和Intel的数学库。代码是非常干净如果我告诉你这不是R革命所独有的呢?你已经能够将Intel MKL与R结合至少十年了。请解释一下哪种代码更干净。至于你的具体问题,CPU除了SIMD之外还有很多技巧,比如缓存、预取数据和超线程。如果有什么不同的话,你的计时也很简单你的代码甚至没有充分利用两个cores@DirkEddelbuettel没有说是的。我说优化的发行版可以使性能提高四倍。至于cleaner,调用像
svd
这样的优化函数肯定比试图重写相同的函数来使用worker更干净。SIMD和multi-code的结合core使
svd
在Quad上运行速度提高7倍,这是它的美妙之处——对于不变的R代码,您可以获得相同的性能增益。BLAS和LAPACK是接口和(更好,但更商业化)MKL实现可以与任何适当的R构建一起工作。标准R、Radford Neal的pqR……你可以说出来。谢谢你的回答。为了澄清并确保我理解你的观点,你会将术语“计算线程”与术语“逻辑处理器”互换使用吗?@Tony,实际上,计算线程是软件级别的概念,因此它意味着您设置了多少线程/过程,例如您尝试过的2/4/12/24。另一方面,“逻辑/物理处理器”指的是机器上固定的硬件资源,例如机器中的2个物理核和4个逻辑处理器。然后,我们考虑如何将计算线程映射到硬件核。在这里,我推荐一个计算线程到一个物理核的策略。