@@ -9,6 +9,7 @@ function clear_task_local_storage!()
99 delete! (task_local_storage (), :CLPlatform )
1010 delete! (task_local_storage (), :CLQueue )
1111 delete! (task_local_storage (), :CLMemoryBackend )
12+ delete! (task_local_storage (), :CLUnifiedMemoryBackend )
1213end
1314
1415
@@ -163,7 +164,7 @@ struct SVMBackend <: AbstractMemoryBackend end
163164struct USMBackend <: AbstractMemoryBackend end
164165struct BufferBackend <: AbstractMemoryBackend end
165166
166- function supported_memory_backends (dev:: Device )
167+ function supported_memory_backends (dev:: Device ; unified = false )
167168 backends = AbstractMemoryBackend[]
168169
169170 # unified shared memory is the first choice, as it gives us separate host and device
@@ -177,7 +178,7 @@ function supported_memory_backends(dev::Device)
177178
178179 # plain old buffers are always supported, but we only want to use them if we have the
179180 # buffer device address extension, which allows us to reference them by raw pointers.
180- if bda_supported (dev)
181+ if ! unified && bda_supported (dev)
181182 push! (backends, BufferBackend ())
182183 end
183184
@@ -187,7 +188,7 @@ function supported_memory_backends(dev::Device)
187188 push! (backends, SVMBackend ())
188189 end
189190
190- if isempty (backends)
191+ if ! unified && isempty (backends)
191192 # as a last resort, use plain buffers without the ability to reference by pointer.
192193 # this severely limits compatibility, but it's better than nothing.
193194 push! (backends, BufferBackend ())
@@ -196,8 +197,9 @@ function supported_memory_backends(dev::Device)
196197 return backends
197198end
198199
199- function default_memory_backend (dev:: Device )
200- supported_backends = supported_memory_backends (dev)
200+ function default_memory_backend (dev:: Device ; unified= false )
201+ supported_backends = supported_memory_backends (dev; unified)
202+ isempty (supported_backends) && return nothing
201203
202204 backend_str = load_preference (OpenCL, " default_memory_backend" )
203205 backend_str === nothing && return first (supported_backends)
@@ -211,8 +213,7 @@ function default_memory_backend(dev::Device)
211213 else
212214 error (" Unknown memory backend '$backend_str ' requested" )
213215 end
214- in (backend, supported_backends) ? backend : nothing
215- backend
216+ return in (backend, supported_backends) ? backend : nothing
216217end
217218
218219function memory_backend ()
@@ -230,6 +231,17 @@ function memory_backend()
230231 end
231232end
232233
234+ function unified_memory_backend ()
235+ return get! (task_local_storage (), :CLUnifiedMemoryBackend ) do
236+ dev = device ()
237+ backend = default_memory_backend (dev; unified= true )
238+ if backend === nothing
239+ error (" Device $(dev) does not support any of the available unified memory backends" )
240+ end
241+ backend
242+ end
243+ end
244+
233245
234246# # per-task queues
235247
0 commit comments