首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R的并行软件包将如何处理第12代效率核心?

R的并行软件包将如何处理第12代效率核心?
EN

Stack Overflow用户
提问于 2022-07-17 13:47:10
回答 1查看 138关注 0票数 0

我计划用i7-12700进行桌面构建,我主要需要它来完成高CPU使用率的R任务,而且大多数情况下并行处理都是起作用的。但我想知道英特尔第12代处理器的新效率核心是如何处理这一任务的。我不是硬件/体系结构方面的专家,所以这个问题听起来可能很愚蠢,但我担心的是以下几点。

  1. 假设我有一个任务,我想将其拆分成8个核心,如何确保任务在性能核心上运行,或者这是由操作系统自动处理的?
  2. 通常,与其他CPU一起,我通常在机器上设置mc.cores =核数,这是正确的方式,还是应该将线程数放在那里?

所以,从根本上说,选择新的第12代CPU比第11代CPU更有效率,比如i7-12700而不是i7-11700?

更新

所以我买了i7-12700并亲自进行了测试。

首先,我使用下面的代码测试了并行作业的默认加载顺序,并将从8提高到了20

当第一次加载时,顺序是每个性能核心的第一个线程>效率核心线程>每个性能核心的第二个线程。

代码语言:javascript
复制
library(parallel)
partask <- function(x) for(idx in 1:x) a<-idx
num_cores <- 8
mclapply(rep(5(10^8),num_cores),partask,mc.cores=num_cores)

然后,我使用下面的R脚本,将每个性能核心的一个线程专门放在加载中。

代码语言:javascript
复制
writeLines("for(idx in 1:(10^11)) a<-idx","sclong.R")
for(thread in c(2*(0:7))) system(paste0("taskset -c ",thread," Rscript sclong.R"),ignore.stdout=TRUE,wait=FALSE)

,然后使用代码对任务进行基准测试,首先是性能核心上的空闲线程,然后是效率核心线程。

代码语言:javascript
复制
writeLines("task <- function(x) for(idx in 1:(x)) a<-idx ; microbenchmark::microbenchmark(task(10^7))","scsmall.R")
system("taskset -c 1 Rscript scsmall.R")
system("taskset -c 16 Rscript scsmall.R")

结果是

代码语言:javascript
复制
> system("taskset -c 1 Rscript scsmall.R")
Unit: milliseconds
       expr      min       lq     mean   median       uq      max neval
 task(10^7) 406.9761 416.4491 426.7444 419.0301 437.0794 464.5673   100
> system("taskset -c 16 Rscript scsmall.R")
Unit: milliseconds
       expr      min       lq    mean   median       uq      max neval
 task(10^7) 422.1205 427.8711 436.172 430.5203 443.5989 463.9686   100

与默认加载顺序相反,如果性能核心上的所有线程都先加载,然后转移到效率核心的线程,则效率会更高。

因此,向mclapply提供affinity.list参数在某些特定情况下可能是有用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-17 17:16:51

处理器亲和力

根据您的操作系统,您可以告诉操作系统不要为某些进程使用(或剥夺)某些内核。这通常被称为处理器关联。下面是一些关于为什么您可能(不)想要这样做的讨论。 parallel package 似乎有一个内置函数可以直接从R执行此操作。,尽管是注意不正确的核心索引。

视窗

您可以使用处理器亲和力选项将特定进程分配到Windows中的特定核心。下面是一个如何做到这一点的例子

苹果

对于苹果操作系统来说,这里的问题基本上是一样的。

Linux

没有这方面的经验,只有下面讨论如何做到这一点

核心/线程数

在这种情况下,“应该”是非常主观的,所以在问题中最好避免。但是,我要尝试一下:在许多情况下,“应该”被“不能”排除在多线程处理中。我推荐读这个来讨论多线程和多线程处理,以及如何实现它(在R中)。请注意,与此无关,许多人建议至少比个人计算机上的核心总数少一个核心,以避免在R离开时完成其他任务的能力可能崩溃或大规模退化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73012306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档