विभेदक शिक्षा में स्मृति आवंटन को कम करना। jl

Dec 08 2020

मैं एक ODE प्रणाली को हल करने के लिए differentialEquations.jl का उपयोग कर रहा हूं जैसा कि नीचे दिखाया गया है। यह परिणाम वास्तव में प्रासंगिक नहीं है क्योंकि pइसमें केवल MWE के उत्पादन के उद्देश्य के लिए परीक्षण पैरामीटर शामिल हैं, लेकिन कुंजी यह है कि मैं इन-प्लेस ODE फ़ंक्शन का उपयोग करने के बावजूद बहुत सारे मेमोरी आवंटन देख रहा हूं।

using DifferentialEquations

function ode_fun!(du,u,p,t)
    a,b,c,d,e = p

    X = @. u[1] * a * ((b-c)/b)
    Y = @. u[2] * d * ((b-e)/b)

    du[1] = -sum(X) + sum(Y) - u[1]*u[2]
    du[2] = sum(X) - sum(Y) - u[1]*u[2]
end

#exemplary parameters 
a = collect(10:-0.1:0.1)
b = a.^2
c = b*0.7
d = collect(0.01:0.01:1)
e = b*0.3

u0 = [1.0, 0.5]
p = [a,b,c,d,e]
tspan = [0.0, 100.0]
t = collect(0:0.01:100) 

prob = ODEProblem(ode_fun!,u0,tspan,p,saveat=t) 
@time sol = solve(prob)

1.837609 seconds (5.17 M allocations: 240.331 MiB, 2.31% gc time) #Julia 1.5.2

चूँकि मुझे इस ODE प्रणाली को बार-बार हल करने की आवश्यकता है क्योंकि मैं जितना संभव हो सके आवंटन कम करना चाहता हूं और सोच रहा हूं कि क्या कुछ है जो उनके बारे में किया जा सकता है। मैं सोच रहा था कि क्या समस्या है Xऔर Yओडीई फ़ंक्शन के बाहर इनको प्रचार करने की कोशिश की गई है, लेकिन दुर्भाग्य से इस तरह से आवंटन कम करने में सफल नहीं हुए हैं।

जवाब

2 OscarSmith Dec 08 2020 at 12:51

मुझे पूरा यकीन है कि यह तेजी से और आधा आवंटन होना चाहिए

function ode_fun!(du,u,p,t)
    a,b,c,d,e = p
    XmY = @. u[1] * a * (1-c/b) - u[2] * d * (1-e/b)
    sXmY = sum(XmY)
    du[1] = -sXmY - u[1]*u[2]
    du[2] = sXmY - u[1]*u[2]
end

शायद उन सभी से छुटकारा पाने का एक तरीका है, लेकिन मैं DifferentialEquationsविशेषज्ञ नहीं हूं ।