Skip to content

Commit ebd3a52

Browse files
committed
fixed offsets and views
1 parent 80a9c69 commit ebd3a52

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

lib/cl/state.jl

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,17 @@ function default_memory_backend(dev::Device)
180180
caps.coarse_grain_buffer
181181
end
182182

183+
if haskey(ENV, "JULIA_OPENCL_BACKEND") && ENV["JULIA_OPENCL_BACKEND"] in ["usm", "bda", "svm"]
184+
user_backend = ENV["JULIA_OPENCL_BACKEND"]
185+
if user_backend == "usm" && usm
186+
return USMBackend()
187+
elseif user_backend == "bda" && bda
188+
return BDABackend()
189+
elseif user_backend == "svm" && svm
190+
return SVMBackend()
191+
end
192+
end
193+
183194
if usm
184195
USMBackend()
185196
else

src/array.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -384,11 +384,11 @@ for (srcty, dstty) in [(:Array, :CLArray), (:CLArray, :Array), (:CLArray, :CLArr
384384
cl.enqueue_svm_copy(pointer(dst, dst_off), pointer(src, src_off), nbytes; blocking)
385385
elseif memtype(device_array) == cl.BufferDeviceMemory
386386
if src isa CLArray && dst isa CLArray
387-
cl.enqueue_bda_copy(convert(cl.cl_mem, dst.data[]), (dst_off - 1) * sizeof(T), convert(cl.cl_mem, src.data[]), (src_off - 1) * sizeof(T), nbytes; blocking)
387+
cl.enqueue_bda_copy(convert(cl.cl_mem, dst.data[]), (dst.offset * Base.elsize(dst)) + (dst_off - 1) * sizeof(T), convert(cl.cl_mem, src.data[]), (src.offset * Base.elsize(src)) + (src_off - 1) * sizeof(T), nbytes; blocking)
388388
elseif dst isa CLArray
389-
cl.enqueue_bda_write(convert(cl.cl_mem, dst.data[]), (dst_off - 1) * sizeof(T), pointer(src, src_off), nbytes; blocking)
389+
cl.enqueue_bda_write(convert(cl.cl_mem, dst.data[]), (dst.offset * Base.elsize(dst)) + (dst_off - 1) * sizeof(T), pointer(src, src_off), nbytes; blocking)
390390
elseif src isa CLArray
391-
cl.enqueue_bda_read(pointer(dst, dst_off), convert(cl.cl_mem, src.data[]), (src_off - 1) * sizeof(T), nbytes; blocking)
391+
cl.enqueue_bda_read(pointer(dst, dst_off), convert(cl.cl_mem, src.data[]), (src.offset * Base.elsize(src)) + (src_off - 1) * sizeof(T), nbytes; blocking)
392392
end
393393
else
394394
cl.enqueue_usm_copy(pointer(dst, dst_off), pointer(src, src_off), nbytes; blocking)
@@ -433,7 +433,7 @@ function Base.fill!(A::DenseCLArray{T}, val) where {T}
433433
if memtype(A) == cl.SharedVirtualMemory
434434
cl.enqueue_svm_fill(pointer(A), convert(T, val), length(A))
435435
elseif memtype(A) == cl.BufferDeviceMemory
436-
cl.enqueue_bda_fill(convert(cl.cl_mem, A.data[]), 0, convert(T, val), length(A))
436+
cl.enqueue_bda_fill(convert(cl.cl_mem, A.data[]), A.offset * Base.elsize(A), convert(T, val), length(A))
437437
else
438438
cl.enqueue_usm_fill(pointer(A), convert(T, val), length(A))
439439
end
@@ -514,7 +514,7 @@ function Base.resize!(a::CLVector{T}, n::Integer) where {T}
514514
if memtype(a) == cl.SharedVirtualMemory
515515
cl.enqueue_svm_copy(ptr, pointer(a), m*sizeof(T); blocking=false)
516516
elseif memtype(a) == cl.BufferDeviceMemory
517-
cl.enqueue_bda_copy(convert(cl.cl_mem, mem), 0, convert(cl.cl_mem, a.data[]), 0, m*sizeof(T); blocking=false)
517+
cl.enqueue_bda_copy(convert(cl.cl_mem, mem), 0, convert(cl.cl_mem, a.data[]), a.offset * Base.elsize(a), m*sizeof(T); blocking=false)
518518
else
519519
cl.enqueue_usm_copy(ptr, pointer(a), m*sizeof(T); blocking=false)
520520
end

0 commit comments

Comments
 (0)