es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo ejecutar una función paralela en Julia?

Me gustaría ejecutar la función f() en mis 4 procesadores (Intel i7) y obtener la suma de los números aleatorios, de la siguiente manera:

using Distributed;
@everywhere function f()
   return sum(rand(10000))
end

@sync for w in workers()
    @async begin
        res = @spawnat w f()
        values[w-1] = fetch(res)
    end
end

Sin embargo, estoy obteniendo el siguiente error:

ERROR: TaskFailedException

    nested task error: MethodError: no method matching setindex!(::typeof(values), ::Float64, ::Int64)
    Stacktrace:
     [1] macro expansion
       @ ./REPL[58]:4 [inlined]
     [2] (::var"#68#70"{Channel{Any}, Int64})()
       @ Main ./task.jl:411
Stacktrace:
 [1] sync_end(c::Channel{Any})
   @ Base ./task.jl:369
 [2] top-level scope
   @ task.jl:388

¡Por favor, guíame para resolver el problema!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el error se debe a que la variable values no está definida. Necesitas definir la variable antes de usarla en el bucle for. Aquí te muestro cómo puedes modificar tu código para solucionar el error:

    using Distributed;
    
    @everywhere function f()
        return sum(rand(10000))
    end
    
    # Define la variable 'values'
    values = zeros(length(workers()))
    
    @sync for w in workers()
        @async begin
            res = @spawnat w f()
            # Usa 'w' en lugar de 'w-1' para indexar 'values'
            values[w] = fetch(res)
        end
    end
    
    # Imprime la suma de 'values'
    println("Suma aleatoria:", sum(values))
    

    En este código modificado, definimos la variable values como un arreglo de ceros con una longitud igual al número de trabajadores. Luego, usamos w en lugar de w-1 para indexar values en el bucle for. Finalmente, imprimimos la suma de values para ver el resultado.

    Espero que esto te ayude!

Comments are closed.