我计划用i7-12700进行桌面构建,我主要需要它来完成高CPU使用率的R任务,而且大多数情况下并行处理都是起作用的。但我想知道英特尔第12代处理器的新效率核心是如何处理这一任务的。我不是硬件/体系结构方面的专家,所以这个问题听起来可能很愚蠢,但我担心的是以下几点。
所以,从根本上说,选择新的第12代CPU比第11代CPU更有效率,比如i7-12700而不是i7-11700?
更新
所以我买了i7-12700并亲自进行了测试。
首先,我使用下面的代码测试了并行作业的默认加载顺序,并将从8提高到了20。
当第一次加载时,顺序是每个性能核心的第一个线程>效率核心线程>每个性能核心的第二个线程。
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脚本,将每个性能核心的一个线程专门放在加载中。
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),然后使用代码对任务进行基准测试,首先是性能核心上的空闲线程,然后是效率核心线程。
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")结果是
> 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参数在某些特定情况下可能是有用的。
发布于 2022-07-17 17:16:51
处理器亲和力
根据您的操作系统,您可以告诉操作系统不要为某些进程使用(或剥夺)某些内核。这通常被称为处理器关联。下面是一些关于为什么您可能(不)想要这样做的讨论。 parallel package 似乎有一个内置函数可以直接从R执行此操作。,尽管是注意不正确的核心索引。。
视窗
您可以使用处理器亲和力选项将特定进程分配到Windows中的特定核心。下面是一个如何做到这一点的例子。
苹果
Linux
没有这方面的经验,只有下面讨论如何做到这一点。
核心/线程数
在这种情况下,“应该”是非常主观的,所以在问题中最好避免。但是,我要尝试一下:在许多情况下,“应该”被“不能”排除在多线程处理中。我推荐读这个来讨论多线程和多线程处理,以及如何实现它(在R中)。请注意,与此无关,许多人建议至少比个人计算机上的核心总数少一个核心,以避免在R离开时完成其他任务的能力可能崩溃或大规模退化。
https://stackoverflow.com/questions/73012306
复制相似问题