Fix GPU array support for Metal and other GPU backends #692
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Issue Description
The issue was that GPU arrays (specifically Metal.jl MtlArray) require special handling in the linear solver construction phase. The original code forced non-aliasing (
alias_A = false, alias_b = false) which caused GPU arrays to be copied to CPU memory, leading to crashes with errors like:Solution
GPU Array Detection: Added heuristic-based GPU array detection that checks type names for common GPU array patterns ("GPU", "Mtl", "Cu", "ROC", "oneAPI")
Proper Aliasing: Enable aliasing for GPU arrays to avoid CPU memory operations that cause crashes
Fallback Strategy: When no specific linear solver is provided and GPU arrays are detected, fall back to
NativeJLLinearSolveCachewhich uses native Julia linear algebra operations compatible with GPU arraysTest plan
NewtonRaphson(linsolve = \, autodiff = AutoFiniteDiff())The fix successfully allows code like this to work:
Impact
This change enables NonlinearSolve.jl to work with:
🤖 Generated with Claude Code