У меня есть код, который я пытаюсь обработать параллельно с помощью пакета foreach. Код работает, но когда я запускаю его на компьютере с 4 ядрами, это занимает около 26 минут, а когда я переключаюсь на компьютер с 32 ядрами, для завершения по-прежнему требуется 13 минут. Мне было интересно, делаю ли я что-то не так, поскольку я использую в 8 раз больше ядер, но сокращаю время только вдвое. Мой код выглядит так:
no_cores <- detectCores()
cl <- makeCluster(no_cores)
registerDoParallel(cl)
Xenopus_Data <- foreach(b=1:length(newly_populated_vec),.packages = c("raster", "gdistance", "rgdal","sp")) %dopar% { Xenopus_Walk(altdata=altdata,water=water,habitat_suitability=habitat_suitability,max_range_without_water=max_range_without_water,max_range=max_range,slope=slope,Start_Pt=newly_populated_vec[b]) }
stopCluster(cl)
Для компьютера с 4 ядрами я получаю следующее время:
Time_of_Start
[1] "2016-07-12 13:07:23 CEST"
Time_of_end
[1] "2016-07-12 13:33:10 CEST"
And for the one with 32 cores:
Time_of_Start
[1] "2016-07-12 14:35:48 CEST"
Time_of_end
[1] "2016-07-12 14:48:08 CEST"
Это нормально ? и если да, то кто-нибудь знает, как его дополнительно ускорить, может, с помощью других пакетов? Любая помощь приветствуется!
РЕДАКТИРОВАТЬ: это время, которое я получаю после внесения исправлений, как было предложено. Для 32 ядер:
User System elapsed
5.99 40.78 243.97
Для 4 ядер:
user system elapsed
1.91 0.94 991.71
Обратите внимание, что раньше я выполнял вычисления несколько раз с помощью некоторых циклов, поэтому время вычислений так резко сократилось, но все же можно сказать, что разница между двумя компьютерами увеличилась, как мне кажется.
getDoParWorkers()
, чтобы убедиться, что с этим все в порядке. (доforeach
) - person 989   schedule 12.07.2016getDoParWorkers()
, равно количеству ядер, имеющихся в моем распоряжении, это полезная функция, которую я буду использовать, чтобы проверить, все ли в порядке. еще не знал об этом. - person snoops   schedule 12.07.2016