Я пытаюсь перенести часть своего R-кода на Джулию; В основном я переписал следующий код R в Джулии:
library(parallel)
eps_1<-rnorm(1000000)
eps_2<-rnorm(1000000)
large_matrix<-ifelse(cbind(eps_1,eps_2)>0,1,0)
matrix_to_compare = expand.grid(c(0,1),c(0,1))
indices<-seq(1,1000000,4)
large_matrix<-lapply(indices,function(i)(large_matrix[i:(i+3),]))
function_compare<-function(x){
which((rowSums(x==matrix_to_compare)==2) %in% TRUE)
}
> system.time(lapply(large_matrix,function_compare))
user system elapsed
38.812 0.024 38.828
> system.time(mclapply(large_matrix,function_compare,mc.cores=11))
user system elapsed
63.128 1.648 6.108
Как можно заметить, я получаю значительное ускорение при переходе с одного ядра на 11. Теперь я пытаюсь сделать то же самое в Джулии:
#Define cluster:
addprocs(11);
using Distributions;
@everywhere using Iterators;
d = Normal();
eps_1 = rand(d,1000000);
eps_2 = rand(d,1000000);
#Create a large matrix:
large_matrix = hcat(eps_1,eps_2).>=0;
indices = collect(1:4:1000000)
#Split large matrix:
large_matrix = [large_matrix[i:(i+3),:] for i in indices];
#Define the function to apply:
@everywhere function function_split(x)
matrix_to_compare = transpose(reinterpret(Int,collect(product([0,1],[0,1])),(2,4)));
matrix_to_compare = matrix_to_compare.>0;
find(sum(x.==matrix_to_compare,2).==2)
end
@time map(function_split,large_matrix )
@time pmap(function_split,large_matrix )
5.167820 seconds (22.00 M allocations: 2.899 GB, 12.83% gc time)
18.569198 seconds (40.34 M allocations: 2.082 GB, 5.71% gc time)
Как можно заметить, я не получаю никакой скорости с pmap. Может кто подскажет альтернативы.
large_matrix
это250000-element Array{Any,1}:
Может проблема в этом? - person daycaster   schedule 05.07.2016addprocs(3)
:4.173674 seconds (22.97 M allocations: 2.943 GB, 14.57% gc time)
и0.795733 seconds (292.07 k allocations: 12.377 MB, 0.83% gc time)
. Также типlarge_matrix
равенArray{BitArray{2},1}
. - person tim   schedule 06.07.2016addprocs(3) : 5.860692 seconds (22.90 M allocations: 2.938 GB, 13.20% gc time);
@time pmap(function_split,large_matrix ) 27.411076 seconds (40.60 M allocations: 2.094 GB, 3.17% gc time)
- person Vitalijs   schedule 06.07.2016pmap
полезен только в том случае, если каждый вызов функции занимает значительное время. В зависимости от того, что вы хотите сделать с результирующим массивом, вам может быть интересен@parallel
. - person tim   schedule 06.07.2016