GPU पर ODE सिस्टम को हल करने के लिए विकल्प?


16

मैं 'trivially parallelisable' सेटिंग में, ODE के सॉल्यूशन सिस्टम को GPU पर खेती करना चाहूंगा। उदाहरण के लिए, 512 अलग-अलग पैरामीटर सेट के साथ संवेदनशीलता विश्लेषण करना।

आदर्श रूप से मैं ODE को सीवीओडीई जैसे स्मार्ट एडेप्टिव टाइमस्टेप सॉल्वर के साथ फॉरवर्ड ईयलर की तरह एक निश्चित टाइमस्टेप के साथ करना चाहता हूं, लेकिन सीपीयू के बजाय इसे एक NVIDIA GPU पर चला रहा हूं।

क्या किसी ने ऐसा किया है? क्या इसके लिए पुस्तकालय हैं?


इसलिए कोष्ठक! मैं एक ऑपरेटर-विभाजन-आधारित तकनीक (कार्डियक इलेक्ट्रोफिजियोलॉजी सिमुलेशन) पर विचार कर रहा हूं, जहां आप पीडीई के लिए स्रोत शब्द प्राप्त करने के लिए नोड्स पर ODEs को हल करते हैं, फिर अगले पुनरावृत्ति के लिए एक ODE पैरामीटर बदलें।
मिराम


1
यह निर्दिष्ट करना महत्वपूर्ण है कि आप प्रत्येक ODE के लिए एक ही समय-चरण का उपयोग करना चाहते हैं या नहीं।
ईसाई क्लैसन

इसके अलावा, यदि आप विशेष रूप से बिडोमैन (या मोनोडोमैन) समीकरणों में रुचि रखते हैं, तो आप यह देख सकते हैं कि सीएआरपी यह कैसे करता है
ईसाई क्लैसन

अलग-अलग टाइमस्टेप्स, यदि विधि अनुकूली है, तो उन्हें अलग-अलग पैरामीटर सेट के लिए उनकी आवश्यकता होगी ... CARP क्या कर रहा है, इसके लिंक के लिए धन्यवाद - एक निश्चित टाइमस्टेप रश लार्सन ODE सॉल्वर यदि मैं इसे सही तरीके से पढ़ता हूं।
मिरम्स

जवाबों:


6

आप बूस्ट के odeint लाइब्रेरी और थ्रस्ट पर गौर करना चाहते हैं । उन्हें यहां चर्चा के रूप में जोड़ा जा सकता है


यह थोड़ा अलग प्रतीत होता है - समानांतर में (संचार के साथ) GPU पर बड़े पैमाने पर ODE सिस्टम को हल करना। उस लिंक का कहना है "हमने अनुभव किया है कि सदिश आकार जिसके समानांतर है GPU के पूर्ण बनाने के लिए 10 ^ 6 के क्रम का होना चाहिए।" मैं O (१०) या O (१००) सदिश के आकार का एक अच्छा तरीका ढूंढ रहा हूँ, जिसका आकार बहुत
हद तक

क्या आपने सीधे क्यूडा या ओपनसीएल में लिखने के बारे में सोचा है? यदि मैं सही मानता हूं, तो आप जो कर रहे हैं, वह प्रत्येक थ्रेड में कुछ ODE समीकरण से अलग है, इसे सीधे लिखना मुश्किल नहीं होना चाहिए।
हाइड्रो गाइ

मुझे लगता है कि फॉरवर्ड यूलर या अन्य निश्चित टाइमस्टेप विधि को कोड करना संभव होगा, जहां हर GPU प्रक्रिया समान टाइमस्टेप का उपयोग करती है, काफी आसानी से, मैं यह जानना चाहूंगा कि क्या किसी ने CVODE की तरह अनुकूली टाइमस्टैपिंग प्राप्त करने में काम किया है, या यह GPGPU पर कुशल बनाना असंभव है?
मिरामस

gpu के साथ समस्या यह है कि आपको डेटा-समानांतर कोड लिखना होगा। यदि आप एक ही अनुकूली दिनचर्या लिखते हैं, लेकिन कुछ मापदंडों के मूल्यों पर उस लचीलेपन को अवशोषित करते हैं, तो संभवत: इसे कुशलता से जीपीयू पर कोड करना संभव है। इसका मतलब यह भी है कि आप निर्देशों पर शाखा का उपयोग नहीं कर सकते हैं, जो कि शायद आपको लगता है कि ऐसा करना असंभव होगा।
हाइड्रो गाय

1
@mirams वहाँ odeint के लिए एक उदाहरण है कि वास्तव में कवर क्या आप के लिए देख रहे हैं: boost.org/doc/libs/1_59_0/libs/numeric/odeint/doc/html/... , यह भी देखें github.com/boostorg/odeint/blob/ मास्टर / उदाहरण / जोर /… । इसके अलावा, odeint CVODE में अनुकूली मल्टीस्टेप विधियों का समर्थन करता है: github.com/boostorg/odeint/blob/master/examples/…
क्रिश्चियन

13

डिफरेंशियल ईक्शंस.ज्ल लाइब्रेरी उच्च स्तरीय भाषा (जूलिया) के लिए एक पुस्तकालय है जिसमें ओडीई प्रणाली को स्वचालित रूप से जीपीयू पर समानांतर समाधान के लिए अनुकूलित संस्करण में बदलने के लिए उपकरण हैं। समानांतरवाद के दो रूप हैं जिन्हें नियोजित किया जा सकता है: बड़े 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 समर्थन के लिए भी होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.