Я использую R на macOS
, и R может видеть 4 ядра и 8 гиперпоточных модулей:
> library(parallel)
> detectCores(logical=TRUE)
[1] 8
> detectCores(logical=FALSE)
[1] 4
Следующий скрипт имеет функцию, которая спит в течение 0,1 секунды, вызывает ее 10 раз и распараллеливаетэти вызовы на нескольких ядрах в диапазоне от 1 до 12:
long_function <- function(x) {
Sys.sleep(0.1)
x
}
for (no_cores in 1:12) {
start <- Sys.time()
x <- mclapply(1:10, long_function, mc.cores = no_cores)
end <- Sys.time()
print(paste0("Parallelised over ", no_cores, " cores, time = ", end - start))
}
Результаты:
[1] "Parallelised over 1 cores, time = 1.00716304779053"
[1] "Parallelised over 2 cores, time = 0.553637027740479"
[1] "Parallelised over 3 cores, time = 0.447566032409668"
[1] "Parallelised over 4 cores, time = 0.338685035705566"
[1] "Parallelised over 5 cores, time = 0.234640121459961"
[1] "Parallelised over 6 cores, time = 0.223365068435669"
[1] "Parallelised over 7 cores, time = 0.226859092712402"
[1] "Parallelised over 8 cores, time = 0.227418899536133"
[1] "Parallelised over 9 cores, time = 0.226329803466797"
[1] "Parallelised over 10 cores, time = 0.116447925567627"
[1] "Parallelised over 11 cores, time = 0.116322040557861"
[1] "Parallelised over 12 cores, time = 0.12298583984375"
Время, проведенное уменьшается ниже нижней границы 1/8 = 0,125 секунды.
Результаты одинаковы, независимо от того, запланированы ли задания с предварительно заданным значением mc.preschedule={T,F}
, и аналогичны для Ubuntu в Azure с 4 виртуальными ЦП, где время выполнения опускается ниже нижней границы 1/4 = 0,25 секунды.
Как это может быть?