Saya ingin menerapkan sistem penyelesaian ODE ke GPU, dalam pengaturan yang 'sepele parallelisable'. Misalnya, melakukan analisis sensitivitas dengan 512 set parameter yang berbeda.
Idealnya saya ingin melakukan penyelesaian ODE dengan solver pencatat waktu adaptif yang cerdas seperti CVODE, daripada pencatat waktu yang tetap seperti Forward Euler, tetapi menjalankannya pada GPU NVIDIA alih-alih CPU.
Adakah yang melakukan ini? Apakah ada perpustakaan untuk itu?
Jawaban:
Anda mungkin ingin melihat ke perpustakaan odeint Boost dan Thrust . Mereka dapat digabungkan sebagaimana dibahas di sini .
sumber
Perpustakaan DifferentialEquations.jl adalah perpustakaan untuk bahasa tingkat tinggi (Julia) yang memiliki alat untuk secara otomatis mengubah sistem ODE ke versi yang dioptimalkan untuk solusi paralel pada GPU. Ada dua bentuk paralelisme yang dapat digunakan: paralelisme berbasis array untuk sistem ODE besar dan paralelisme parameter untuk studi parameter pada sistem ODE yang relatif kecil (<100). Ini mendukung metode tersirat dan eksplisit urutan tinggi dan secara rutin mengungguli atau mencocokkan sistem lain dalam tolok ukur (setidaknya, itu membungkus yang lain sehingga mudah untuk memeriksa dan menggunakannya!)
Untuk fungsi khusus ini, Anda mungkin ingin melihat DiffEqGPU.jl yang merupakan modul untuk paralelisme parameter otomatis. Pustaka DifferentialEquations.jl memiliki fungsi untuk studi parameter paralel , dan modul ini menambah konfigurasi yang ada untuk membuat studi terjadi secara otomatis secara paralel. Apa yang dilakukan adalah mengubah yang sudah ada
ODEProblem
(atauDEProblem
sejenisnyaSDEProblem
) menjadiEnsembleProblem
dan tentukan denganprob_func
bagaimana masalah lain dihasilkan dari prototipe. Berikut ini memecahkan 10.000 lintasan persamaan Lorenz pada GPU dengan metode adaptif eksplisit orde tinggi:Perhatikan bahwa pengguna tidak perlu menulis kode GPU, dan dengan satu RTX 2080 tolok ukur ini sebagai peningkatan 5x dibandingkan menggunakan mesin 16 inti Xeon dengan paralelisme multithreaded. Satu kemudian dapat memeriksa README untuk bagaimana melakukan hal-hal seperti memanfaatkan beberapa GPU dan melakukan multiprocessing + GPU untuk memanfaatkan sekelompok penuh GPU secara bersamaan . Perhatikan bahwa beralih ke multithreading alih-alih GPU adalah perubahan satu baris:
EnsembleThreads()
alih-alihEnsembleGPUArray()
.Kemudian untuk pemecah implisit, antarmuka yang sama berlaku. Misalnya, berikut ini menggunakan Rosenbrock orde tinggi dan metode Runge-Kutta implisit:
Meskipun formulir ini mengharuskan Anda memberikan Jacobian agar dapat digunakan pada GPU (saat ini, akan segera diperbaiki), dokumentasi DifferentialEquations.jl menunjukkan cara melakukan perhitungan Jacobian simbolis simbolis pada fungsi yang ditentukan secara numerik , sehingga masih belum ada manual kerja di sini. Saya akan sangat merekomendasikan algoritma ini karena logika percabangan dari metode seperti CVODE umumnya menyebabkan desync thread dan tampaknya tidak berkinerja sebaik metode Rosenbrock dalam jenis skenario ini.
Dengan menggunakan DifferentialEquations.jl, Anda juga mendapatkan akses ke perpustakaan lengkap, yang mencakup fungsionalitas seperti analisis sensitivitas global yang dapat memanfaatkan akselerasi GPU ini. Ini juga kompatibel dengan angka ganda untuk analisis sensitivitas lokal cepat . Kode berbasis GPU mendapatkan semua fitur DifferentialEquations.jl, seperti penanganan acara dan serangkaian besar pemecah ODE yang dioptimalkan untuk berbagai jenis masalah , yang berarti bukan hanya pemecah ODE GPU satu-kali yang sederhana tetapi sebagai bagian dari sistem berfitur lengkap yang kebetulan juga memiliki dukungan GPU yang efisien.
sumber