Skip to content

Commit 2f591e1

Browse files
committed
Change default storage mode to SharedStorage on UMA devices
- Add 'auto' mode (new default) that detects unified memory architecture - Apple Silicon (UMA): defaults to SharedStorage (zero-copy CPU access) - Intel discrete GPU: defaults to PrivateStorage - User preference override still works via LocalPreferences.toml - Add tests for default storage mode selection
1 parent dce2026 commit 2f591e1

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/array.jl

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,14 +190,18 @@ See also `VecOrMat`(@ref) for examples.
190190
"""
191191
const MtlVecOrMat{T,S} = Union{MtlVector{T,S},MtlMatrix{T,S}}
192192

193-
# default to private memory
194-
const DefaultStorageMode = let str = @load_preference("default_storage", "private")
193+
# default storage mode: "auto" selects based on unified memory architecture
194+
# - UMA devices (Apple Silicon): SharedStorage (zero-copy CPU access)
195+
# - Non-UMA devices (Intel discrete GPU): PrivateStorage
196+
const DefaultStorageMode = let str = @load_preference("default_storage", "auto")
195197
if str == "private"
196198
PrivateStorage
197199
elseif str == "shared"
198200
SharedStorage
201+
elseif str == "auto"
202+
MTLDevice(1).hasUnifiedMemory ? SharedStorage : PrivateStorage
199203
else
200-
error("unknown default storage mode: $default_storage")
204+
error("unknown default storage mode: $str")
201205
end
202206
end
203207

test/array.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,25 @@ STORAGEMODES = [Metal.PrivateStorage, Metal.SharedStorage]
22

33
@testset "array" begin
44

5+
@testset "default storage mode" begin
6+
# Test that default storage mode respects UMA detection
7+
if Metal.device().hasUnifiedMemory
8+
@test Metal.DefaultStorageMode == Metal.SharedStorage
9+
else
10+
@test Metal.DefaultStorageMode == Metal.PrivateStorage
11+
end
12+
13+
# Test that arrays created without explicit storage use the default
14+
arr = MtlArray{Float32}(undef, 100)
15+
@test Metal.storagemode(arr) == Metal.DefaultStorageMode
16+
17+
# Test that explicit storage mode overrides the default
18+
arr_private = MtlArray{Float32, 1, Metal.PrivateStorage}(undef, 100)
19+
arr_shared = MtlArray{Float32, 1, Metal.SharedStorage}(undef, 100)
20+
@test Metal.storagemode(arr_private) == Metal.PrivateStorage
21+
@test Metal.storagemode(arr_shared) == Metal.SharedStorage
22+
end
23+
524
let arr = MtlVector{Int}(undef, 1)
625
@test sizeof(arr) == 8
726
@test length(arr) == 1

0 commit comments

Comments
 (0)