# Help with @distributed with an iterator and speed issue

I have two questions about the following code (in which I’m looking to get the largest eigenvalue of a matrix by permuting its rows).

``````using LinearAlgebra, Combinatorics, Distributed

function maxeig(A::Matrix)
return maximum(real.(eigvals(A)))
end

function maxmaxeig(A::Matrix)
n, c = size(A)
f(p) = maxeig(A[p,:])
return maximum(f(p) for p in permutations(1:n))
end

function maxmaxeig_dist(A::Matrix)
n, c = size(A)
f(p) = maxeig(A[p,:])
@distributed (max) for p in permutations(1:n)
f(p)
end
end

``````

Question 1

The first function works fine, but this seems to be a good candidate for distributed computing. So I start with `julia -p 8` and include this code with an `@everywhere include("filename.jl")`. The distributed version fails with this error message:

``````julia> maxmaxeig_dist(A)
ERROR: MethodError: no method matching firstindex(::Combinatorics.Permutations{Int64})
Closest candidates are:
firstindex(::Any, ::Any) at abstractarray.jl:366
firstindex(::Polynomials.LaurentPolynomial) at /Users/ers/.julia/packages/Polynomials/1aa8e/src/polynomials/LaurentPolynomial.jl:225
firstindex(::Polynomials.SparsePolynomial) at /Users/ers/.julia/packages/Polynomials/1aa8e/src/polynomials/SparsePolynomial.jl:143
...
Stacktrace:
 preduce(reducer::Function, f::Function, R::Combinatorics.Permutations{Int64})
@ Distributed /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.6/Distributed/src/macros.jl:269
 maxmaxeig_dist(A::Matrix{Int64})
@ Main ~/tmp/maxmaxeig.jl:16
 top-level scope
@ REPL:1
``````

I can make the parallel version work properly by replacing `for p in permutations(1:n) ` with `for p in collect(permutations(1:n))` which expands the iterator `permutations(1:n)` into a very long list.

Question 2

The distributed version is a good deal slower than the first, even if I “level the playing field” by wrapping `for p in permutations(1:n)` with `collect`. I’m guessing that I’ve got a lot of data movement involving the passing the matrix `A` (say, 10-by-10) around.

Finally: I’m not an expert, so beginner friendly advice would be most welcome. Thanks!