Cluster Multi-GPU Support in DiffEqGPU
The DiffEqGPU automated GPU parallelism tools now support multiple GPUs. The README now shows that one can do things like:
Setup processes with different CUDA devices
using Distributed addprocs(numgpus) import CUDAdrv, CUDAnative
let gpuworkers = asyncmap(collect(zip(workers(), CUDAdrv.devices()))) do (p, d) remotecall_wait(CUDAnative.device!, p, d) p end
to setup each individual process with a separate GPU, and then the standard usage of DiffEqGPU.jl:
function lorenz(du,u,p,t) @inbounds begin du = p(u-u) du = u(p-u) - u du = uu - pu 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...
This release covers the completion of another successful summer. We have now completed a new round of tooling for solving large stiff and sparse differential equations. Most of this is covered in the exciting….
New Tutorial: Solving Stiff Equations for Advanced Users!
That is right, we now have a new tutorial added to the documentation on solving stiff differential equations. This tutorial goes into depth, showing how to use our recent developments to do things like automatically detect and optimize a solver with respect to sparsity pattern, or automatically symbolically calculate a Jacobian from a numerical code. This should serve...
Let’s just jump right in! This time we have a bunch of new GPU tools and sparsity handling.
(Breaking with Deprecations) DiffEqGPU: GPU-based Ensemble Simulations
The MonteCarloProblem interface received an overhaul. First of all, the interface has been renamed to Ensemble. The changes are:
MonteCarloProblem -> EnsembleProblem MonteCarloSolution -> EnsembleSolution MonteCarloSummary -> EnsembleSummary num_monte -> trajectories
Specifying parallel_type has been deprecated and a deprecation warning is thrown mentioning this. So don’t worry: your code will work but will give warnings as to what to change. Additionally, the DiffEqMonteCarlo.jl package is no longer necessary for any of this functionality.
Sparsity Performance: Jacobian coloring with numerical and forward differentiation
If you have a function f!(du,u) which has a Tridiagonal Jacobian, you could calculate that Jacobian by mixing perturbations. For example, instead of doing u .+ [epsilon,0,0,0,0,0,0,0,…], you’d do u .+ [epsilon,0,0,epsilon,0,0,…]. Because the epsilons will never overlap, you can then decode this “compressed” Jacobian into the sparse form. Do that 3 times and boom, full Jacobian in 4 calls to f! no matter the size of u! Without a color vector, this matrix would take 1+length(u) f! calls, so I’d say that’s a pretty good speedup.
This is called Jacobian...
Well, we zoomed towards this one. In this release we have a lot of very compelling
new features for performance in specific domains. Large ODEs, stiff SDEs, high
accuracy ODE solving, many callbacks, etc. are all specialized on and greatly
improved in this PR.