Я хотел бы вывести системы решения ODE на графические процессоры в «тривиально распараллеливаемой» обстановке. Например, анализ чувствительности с 512 различными наборами параметров.
В идеале я хочу решать ODE с помощью интеллектуального адаптивного временного шага, такого как CVODE, а не с фиксированным временным шагом, как Forward Euler, но запускать его на GPU NVIDIA вместо CPU.
Кто-нибудь делал это? Есть библиотеки для этого?
Ответы:
Вы можете заглянуть в odeint библиотеку Boost и Thrust . Они могут быть объединены как обсуждено здесь .
источник
Библиотека DifferentialEquations.jl - это библиотека для языка высокого уровня (Julia), которая имеет инструменты для автоматического преобразования системы ODE в оптимизированную версию для параллельного решения на графических процессорах. Можно использовать две формы параллелизма: параллелизм на основе массива для больших систем ODE и параллелизм параметров для исследования параметров на относительно небольших (<100) системах ODE. Он поддерживает неявные и явные методы высокого порядка и обычно превосходит или сопоставляет другие системы в тестах (по крайней мере, он оборачивает другие, поэтому их легко проверить и использовать!)
Для этой специфической функциональности вы можете взглянуть на DiffEqGPU.jl, который является модулем для автоматического параллелизма параметров. Библиотека DifferentialEquations.jl имеет функциональность для параллельных исследований параметров , и этот модуль дополняет существующие конфигурации для автоматического параллельного изучения. То, что вы делаете, это преобразовывает их существующие
ODEProblem
(или другиеDEProblem
подобныеSDEProblem
) вEnsembleProblem
и указывает,prob_func
как другие проблемы генерируются из прототипа. Следующее решает 10 000 траекторий уравнения Лоренца на графическом процессоре с помощью явного адаптивного метода высокого порядка:Обратите внимание, что пользователю не нужно писать код графического процессора, и с одним RTX 2080 этот тест оценивается как пятикратное улучшение по сравнению с использованием 16-ядерного компьютера Xeon с многопоточным параллелизмом. Затем можно проверить README о том, как использовать несколько графических процессоров и мультипроцессорные + графические процессоры для одновременного использования полного кластера графических процессоров . Обратите внимание, что переключение на многопоточность вместо графических процессоров является одним изменением строки:
EnsembleThreads()
вместоEnsembleGPUArray()
.Тогда для неявных решателей имеет место тот же интерфейс. Например, следующее использует Rosenbrock высокого порядка и неявные методы Runge-Kutta:
Хотя эта форма требует, чтобы вы указали якобиан для использования в графическом процессоре (в настоящее время это будет исправлено в ближайшее время), в документации DifrentialEquations.jl показано, как выполнять автоматические символьные вычисления якобиана для численно определенных функций. , поэтому руководство по-прежнему отсутствует. работа здесь. Я бы настоятельно рекомендовал эти алгоритмы, потому что логика ветвления такого метода, как CVODE, обычно вызывает рассинхронизацию потоков и, похоже, в любом случае не работает так же хорошо, как метод Розенброка в этих типах сценариев.
Используя diffrentialEquations.jl, вы также получаете доступ ко всей библиотеке, которая включает в себя такие функции, как глобальный анализ чувствительности, который может использовать это ускорение GPU. Он также совместим с двойными числами для быстрого анализа локальной чувствительности . Код на основе графического процессора получает все функции DifrentialEquations.jl, такие как обработка событий и большой набор решателей ODE, которые оптимизированы для различных типов проблем , то есть это не просто одноразовый GPU ODE решатель, а вместо этого часть полнофункциональной системы, которая также имеет эффективную поддержку графического процессора.
источник