ডিফারফেনিয়ালএকোয়াশনস.জেএল লাইব্রেরি একটি উচ্চ স্তরের ভাষার (জুলিয়া) লাইব্রেরি যা স্বয়ংক্রিয়ভাবে জিডিইউগুলিতে সমান্তরাল সমাধানের জন্য ওডিই সিস্টেমটিকে একটি অনুকূলিত সংস্করণে রূপান্তর করার সরঞ্জামগুলি রয়েছে tools সমান্তরালতার দুটি রূপ রয়েছে যা নিযুক্ত করা যেতে পারে: বড় ওডিডি সিস্টেমগুলির জন্য অ্যারে-ভিত্তিক সমান্তরালতা এবং অপেক্ষাকৃত ছোট (<100) ওডিই সিস্টেমগুলিতে প্যারামিটার অধ্যয়নের জন্য প্যারামিটার সমান্তরালতা। এটি হাই অর্ডার অন্তর্নিহিত এবং স্পষ্ট পদ্ধতিগুলি সমর্থন করে এবং নিয়মিতভাবে আউটফর্ম করে বা বেঞ্চমার্কগুলিতে অন্যান্য সিস্টেমগুলির সাথে মেলে (খুব কমপক্ষে, এটি অন্যকে জড়িয়ে দেয় যাতে এগুলি চেক করা এবং ব্যবহার করা সহজ হয়!)
এই নির্দিষ্ট কার্যকারিতাটির জন্য, আপনি ডিফেকিউজিপিইউ.জেএল একবার দেখতে চাইতে পারেন যা স্বয়ংক্রিয় প্যারামিটার সমান্তরালতার জন্য মডিউল। ডিফারেনটিয়ালএকোয়াশনস.জেএল লাইব্রেরিতে সমান্তরাল প্যারামিটার অধ্যয়নের জন্য কার্যকারিতা রয়েছে এবং সমান্তরালে অধ্যয়নটি স্বয়ংক্রিয়ভাবে ঘটতে এই মডিউলটি বিদ্যমান কনফিগারেশনগুলিকে বাড়িয়ে তোলে। কি এক নেই তাদের বিদ্যমান রূপান্তরিত ODEProblem
(অথবা অন্যান্য DEProblem
মত SDEProblem
একটি মধ্যে) EnsembleProblem
এবং সঙ্গে উল্লেখ prob_func
কিভাবে অন্য সমস্যা প্রোটোটাইপ থেকে তৈরি হয়। নিম্নলিখিতটি হাই-অর্ডার সুস্পষ্ট অভিযোজিত পদ্ধতির সাথে জিপিইউতে লোরেঞ্জ সমীকরণের 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)
লক্ষ্য করুন যে ব্যবহারকারীকে কোনও জিপিইউ কোড লিখতে হবে না, এবং একক আরটিএক্স 2080 দিয়ে এই বেঞ্চমার্কগুলিকে মাল্টিথ্রেডেড সমান্তরালতা সহ 16 টি কোর জিয়ন মেশিন ব্যবহারের চেয়ে 5x উন্নতি হিসাবে চিহ্নিত করা উচিত। এরপরে একসাথে জিপিইউর পুরো ক্লাস্টারটি ব্যবহারের জন্য একাধিক জিপিইউ ব্যবহার এবং মাল্টিপ্রসেসিং + জিপিইউ করার মতো কাজগুলি কীভাবে করা যায় তার জন্য README টি পরীক্ষা করে দেখতে পারেন । নোট করুন যে জিপিইউগুলির পরিবর্তে মাল্টিথ্রেডিংয়ে স্যুইচ করা হ'ল এক লাইন পরিবর্তন: 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)
এই ফর্মটি আপনাকে জিপিইউতে ব্যবহার করার জন্য একটি জ্যাকবিয়ান প্রদান করার প্রয়োজন রয়েছে (বর্তমানে, শীঘ্রই সংশোধন করা হবে), ডিফারফেনিয়ালএকোভেশনস.জেএল ডকুমেন্টেশনটি দেখায় যে সংখ্যায়িত সংজ্ঞায়িত ফাংশনগুলিতে কীভাবে স্বয়ংক্রিয় প্রতীকী জ্যাকবীয় গণনা করা যায় , সুতরাং এখনও কোনও ম্যানুয়াল নেই শ্রম এখানে। আমি অত্যন্ত এই অ্যালগরিদমগুলিকে সুপারিশ করব কারণ সিভিওডিএর মতো কোনও পদ্ধতির শাখা যুক্তি সাধারণত থ্রেড ডিজাইনের কারণ হয়ে থাকে এবং যাইহোক এই ধরণের পরিস্থিতিতে কোনও রোজনব্রোক পদ্ধতি যেমন সম্পাদন করে না বলে মনে হয়।
ডিফারেন্টিয়ালএকোয়াশনস.জেএল ব্যবহার করে আপনি সম্পূর্ণ লাইব্রেরিতে অ্যাক্সেস পাবেন, এতে গ্লোবাল সংবেদনশীলতা বিশ্লেষণের মতো কার্যকারিতা রয়েছে যা এই জিপিইউ-ত্বরণকে ব্যবহার করতে পারে। এটি দ্রুত স্থানীয় সংবেদনশীলতা বিশ্লেষণের জন্য দ্বৈত সংখ্যার সাথেও সামঞ্জস্যপূর্ণ । জিপিইউ-ভিত্তিক কোড ডিফার্নটিয়ালএকোভেশনস.জেএল এর সমস্ত বৈশিষ্ট্য পেয়েছে, যেমন ইভেন্ট হ্যান্ডলিং এবং বিভিন্ন ধরণের সমস্যার জন্য অনুকূলিত হওয়া ওডিই সল্ভারের বিশাল সেট , যার অর্থ এটি কেবল একটি সহজ এক অফ জিপিইউ ওডিই সলভার নয় বরং পরিবর্তে একটি একটি সম্পূর্ণ বৈশিষ্ট্যযুক্ত সিস্টেমের অংশ যা দক্ষ জিপিইউ সমর্থন পাওয়ার ক্ষেত্রেও ঘটে।