Chciałbym wdrożyć systemy rozwiązywania ODE na GPU w „trywialnie równoległym” ustawieniu. Na przykład, wykonując analizę wrażliwości z 512 różnymi zestawami parametrów.
Idealnie chciałbym wykonać rozwiązywanie ODE za pomocą inteligentnego adaptacyjnego solvera pomiaru czasu, takiego jak CVODE, zamiast stałego pomiaru czasu, takiego jak Forward Euler, ale działającego na GPU NVIDIA zamiast na procesorze.
Czy ktoś to zrobił? Czy są do tego biblioteki?
Odpowiedzi:
Możesz zajrzeć do biblioteki Odeint Boost i Thrust . Można je łączyć, jak omówiono tutaj .
źródło
Biblioteka DifferentialEquations.jl jest biblioteką dla języka wysokiego poziomu (Julia), która ma narzędzia do automatycznej transformacji systemu ODE w zoptymalizowaną wersję dla równoległego rozwiązania na GPU. Istnieją dwie formy równoległości, które można zastosować: równoległość tablicowa dla dużych systemów ODE i równoległość parametrów do badań parametrów na stosunkowo małych (<100) systemach ODE. Obsługuje niejawne i jawne metody wyższego rzędu oraz rutynowo osiąga lepsze wyniki lub dopasowuje inne systemy w testach porównawczych (przynajmniej otacza inne systemy , dzięki czemu można je łatwo sprawdzić i użyć!)
Aby zobaczyć tę konkretną funkcjonalność, możesz zajrzeć na DiffEqGPU.jl, który jest modułem automatycznej równoległości parametrów. Biblioteka DifferentialEquations.jl ma funkcjonalność dla równoległych badań parametrów , a ten moduł rozszerza istniejące konfiguracje, aby badanie odbywało się automatycznie równolegle. To, co robi, przekształca ich istniejące
ODEProblem
(lub inneDEProblem
podobneSDEProblem
) wEnsembleProblem
i określa, wprob_func
jaki sposób inne problemy są generowane z prototypu. Poniższe rozwiązuje 10 000 trajektorii równania Lorenza na GPU za pomocą jawnej metody adaptacyjnej wysokiego rzędu:Zauważ, że użytkownik nie musi pisać kodu GPU, a przy pojedynczym RTX 2080 ten test porównawczy stanowi 5-krotną poprawę w porównaniu z użyciem 16-rdzeniowej maszyny Xeon z wielowątkową równoległością. Następnie można sprawdzić plik README, aby dowiedzieć się, jak korzystać z wielu procesorów graficznych i robić procesory wieloprocesorowe + procesory graficzne w celu jednoczesnego wykorzystania pełnego klastra procesorów graficznych . Zauważ, że przejście na wielowątkowość zamiast GPU to zmiana jednej linii:
EnsembleThreads()
zamiastEnsembleGPUArray()
.Następnie dla niejawnych solverów obowiązuje ten sam interfejs. Na przykład, w poniższym przykładzie zastosowano metody Rosenbrocka wysokiego poziomu i niejawne metody Runge-Kutty:
Chociaż ten formularz wymaga podania jakobianu w celu użycia go na GPU (obecnie zostanie to naprawione wkrótce), dokumentacja DifferentialEquations.jl pokazuje, jak wykonywać automatyczne symboliczne obliczenia jakobianowe na funkcjach zdefiniowanych liczbowo , więc nadal nie ma instrukcji poród tutaj. Zdecydowanie poleciłbym te algorytmy, ponieważ logika rozgałęziania metody takiej jak CVODE generalnie powoduje desynchronizację wątków i wydaje się nie działać tak dobrze, jak metoda Rosenbrock w tego typu scenariuszach.
Korzystając z DifferentialEquations.jl, masz również dostęp do pełnej biblioteki, która zawiera funkcje takie jak globalna analiza wrażliwości, która może korzystać z tego przyspieszenia GPU. Jest także kompatybilny z podwójnymi liczbami w celu szybkiej lokalnej analizy czułości . Kod oparty na GPU ma wszystkie funkcje DifferentialEquations.jl, takie jak obsługa zdarzeń i duży zestaw solverów ODE, które są zoptymalizowane pod kątem różnych rodzajów problemów , co oznacza, że nie jest to zwykły jednorazowy solver ODE GPU, ale zamiast tego część w pełni funkcjonalnego systemu, który ma również wydajną obsługę GPU.
źródło