डिफरेंशियल ईक्शंस.ज्ल लाइब्रेरी उच्च स्तरीय भाषा (जूलिया) के लिए एक पुस्तकालय है जिसमें ओडीई प्रणाली को स्वचालित रूप से जीपीयू पर समानांतर समाधान के लिए अनुकूलित संस्करण में बदलने के लिए उपकरण हैं। समानांतरवाद के दो रूप हैं जिन्हें नियोजित किया जा सकता है: बड़े ODE सिस्टम के लिए सरणी-आधारित समानता और अपेक्षाकृत छोटे (<100) ODE सिस्टम पर पैरामीटर अध्ययन के लिए पैरामीटर समानता। यह उच्च आदेश निहित और स्पष्ट तरीकों और नियमित रूप से आउटपरफॉर्म करने या बेंचमार्क में अन्य प्रणालियों से मेल खाने का समर्थन करता है (बहुत कम से कम, यह दूसरों को लपेटता है इसलिए यह जांचना और उनका उपयोग करना आसान है!)
इस विशिष्ट कार्यक्षमता के लिए, आप DiffEqGPU.jl पर एक नज़र रखना चाहते हैं जो स्वचालित पैरामीटर समानता के लिए मॉड्यूल है। डिफरेंशियल ईक्शंस.जेएल लाइब्रेरी में समानांतर पैरामीटर अध्ययन के लिए कार्यक्षमता है , और यह मॉड्यूल अध्ययन को स्वचालित रूप से समानांतर बनाने के लिए मौजूदा कॉन्फ़िगरेशन को बढ़ाता है। जो कुछ करता है वह उनके मौजूदा ODEProblem
(या अन्य DEProblem
जैसे SDEProblem
) को एक में बदल देता है EnsembleProblem
और निर्दिष्ट prob_func
करता है कि प्रोटोटाइप से अन्य समस्याएं कैसे उत्पन्न होती हैं। एक उच्च आदेश स्पष्ट अनुकूली विधि के साथ GPU पर लोरेंज समीकरण के 10,000 प्रक्षेपवक्र निम्नलिखित हल करता है:
using OrdinaryDiffEq, DiffEqGPU
function lorenz(du,u,p,t)
@inbounds begin
du[1] = p[1]*(u[2]-u[1])
du[2] = u[1]*(p[2]-u[3]) - u[2]
du[3] = u[1]*u[2] - p[3]*u[3]
end
nothing
end
u0 = Float32[1.0;0.0;0.0]
tspan = (0.0f0,100.0f0)
p = (10.0f0,28.0f0,8/3f0)
prob = ODEProblem(lorenz,u0,tspan,p)
prob_func = (prob,i,repeat) -> remake(prob,p=rand(Float32,3).*p)
monteprob = EnsembleProblem(prob, prob_func = prob_func)
@time sol = solve(monteprob,Tsit5(),EnsembleGPUArray(),trajectories=10_000,saveat=1.0f0)
ध्यान दें कि उपयोगकर्ता को कोई GPU कोड लिखने की आवश्यकता नहीं है, और एक आरटीएक्स 2080 के साथ यह बेंचमार्क 5x सुधार के रूप में मल्टीथ्रेडेड समानता के साथ 16 कोर एक्सॉन मशीन का उपयोग कर रहा है। एक से अधिक जीपीयू का उपयोग करने और एक साथ जीपीयू के पूर्ण क्लस्टर का उपयोग करने के लिए मल्टीप्रोसेसिंग + जीपीयू करने जैसी चीजों के लिए README की जांच कर सकते हैं । ध्यान दें कि GPUs के बजाय मल्टीथ्रेडिंग पर स्विच करना एक लाइन परिवर्तन है: EnsembleThreads()
इसके बजाय EnsembleGPUArray()
।
तब निहित सॉल्वर के लिए, एक ही इंटरफ़ेस होता है। उदाहरण के लिए, निम्न उच्च क्रम रोसेनब्रोक और अंतर्निहित रन-कुट्टा विधियों का उपयोग करता है:
function lorenz_jac(J,u,p,t)
@inbounds begin
σ = p[1]
ρ = p[2]
β = p[3]
x = u[1]
y = u[2]
z = u[3]
J[1,1] = -σ
J[2,1] = ρ - z
J[3,1] = y
J[1,2] = σ
J[2,2] = -1
J[3,2] = x
J[1,3] = 0
J[2,3] = -x
J[3,3] = -β
end
nothing
end
function lorenz_tgrad(J,u,p,t)
nothing
end
func = ODEFunction(lorenz,jac=lorenz_jac,tgrad=lorenz_tgrad)
prob_jac = ODEProblem(func,u0,tspan,p)
monteprob_jac = EnsembleProblem(prob_jac, prob_func = prob_func)
@time solve(monteprob_jac,Rodas5(linsolve=LinSolveGPUSplitFactorize()),EnsembleGPUArray(),dt=0.1,trajectories=10_000,saveat=1.0f0)
@time solve(monteprob_jac,TRBDF2(linsolve=LinSolveGPUSplitFactorize()),EnsembleGPUArray(),dt=0.1,trajectories=10_000,saveat=1.0f0)
जबकि इस फ़ॉर्म के लिए आवश्यक है कि आप GPU पर उपयोग करने के लिए एक जेकोबियन दें (वर्तमान में, जल्द ही ठीक हो जाएगा), डिफ़रेंशियल ईक्शन्स.jl प्रलेखन दर्शाता है कि संख्यात्मक रूप से परिभाषित कार्यों पर स्वचालित प्रतीकात्मक जैकबियन गणना कैसे करें , इसलिए अभी भी कोई मैनुअल नहीं है यहाँ श्रम। मैं इन एल्गोरिदम की अत्यधिक अनुशंसा करता हूं क्योंकि CVODE जैसी विधि की शाखाओं वाली तर्क आम तौर पर थ्रेड डेसिंक का कारण बनता है और इस तरह के परिदृश्य में वैसे भी एक रोसेनब्रोक विधि का प्रदर्शन नहीं करता है।
डिफरेंशियल ईक्शंस.ज्ल का उपयोग करके, आप पूर्ण लाइब्रेरी तक भी पहुंच प्राप्त करते हैं, जिसमें वैश्विक संवेदनशीलता विश्लेषण जैसी कार्यक्षमता शामिल है जो इस GPU-त्वरण का उपयोग कर सकती है। यह तेज स्थानीय संवेदनशीलता विश्लेषण के लिए दोहरी संख्या के साथ भी संगत है । GPU- आधारित कोड को डिफ़रेंशियल ईक्शन्स की सभी सुविधाएँ मिलती हैं। जेएल, जैसे इवेंट हैंडलिंग और ODE सॉल्वर का बड़ा सेट, जो विभिन्न प्रकार की समस्याओं के लिए अनुकूलित है , जिसका अर्थ है कि यह केवल एक साधारण-बंद GPU ODE सॉल्वर नहीं है और इसके बजाय एक पूरी तरह से चित्रित प्रणाली का हिस्सा जो कुशल GPU समर्थन के लिए भी होता है।