diff --git a/src/KernelAbstractions.jl b/src/KernelAbstractions.jl index 750c3913..6eb11af8 100644 --- a/src/KernelAbstractions.jl +++ b/src/KernelAbstractions.jl @@ -187,6 +187,8 @@ After releasing the memory of an array, it should no longer be accessed. """ function unsafe_free! end +unsafe_free!(::AbstractArray) = return + ### # Kernel language # - @localmem diff --git a/src/cpu.jl b/src/cpu.jl index ac1f970f..e383386f 100644 --- a/src/cpu.jl +++ b/src/cpu.jl @@ -1,4 +1,3 @@ -unsafe_free!(::AbstractArray) = return synchronize(::CPU) = nothing allocate(::CPU, ::Type{T}, dims::Tuple) where {T} = Array{T}(undef, dims) diff --git a/src/pocl/backend.jl b/src/pocl/backend.jl index c09daf88..537ef066 100644 --- a/src/pocl/backend.jl +++ b/src/pocl/backend.jl @@ -18,25 +18,46 @@ export POCLBackend struct POCLBackend <: KA.GPU end -# KA.allocate(::POCLBackend, ::Type{T}, dims::Tuple) where T = CLArray{T}(undef, dims) -# KA.zeros(::POCLBackend, ::Type{T}, dims::Tuple) where T = OpenCL.zeros(T, dims) -# KA.ones(::POCLBackend, ::Type{T}, dims::Tuple) where T = OpenCL.ones(T, dims) -# KA.get_backend(::CLArray) = POCLBackend() -# KA.synchronize(::POCLBackend) = cl.finish(cl.queue()) -# KA.supports_float64(::POCLBackend) = false # XXX: this is platform/device dependent - -# Adapt.adapt_storage(::POCLBackend, a::Array) = Adapt.adapt(CLArray, a) -# Adapt.adapt_storage(::POCLBackend, a::CLArray) = a -# Adapt.adapt_storage(::KA.CPU, a::CLArray) = convert(Array, a) +## Memory Operations +KA.allocate(::POCLBackend, ::Type{T}, dims::Tuple) where {T} = Array{T}(undef, dims) + +function KA.zeros(backend::POCLBackend, ::Type{T}, dims::Tuple) where {T} + arr = allocate(backend, T, dims) + kernel = init_kernel(backend) + kernel(arr, zero, T, ndrange = length(arr)) + return arr +end +function KA.ones(backend::POCLBackend, ::Type{T}, dims::Tuple) where {T} + arr = allocate(backend, T, dims) + kernel = init_kernel(backend) + kernel(arr, one, T; ndrange = length(arr)) + return arr +end + +function KA.copyto!(backend::POCLBackend, A, B) + if get_backend(A) == get_backend(B) && get_backend(A) isa POCLBackend + if length(A) != length(B) + error("Arrays must match in length") + end + if Base.mightalias(A, B) + error("Arrays may not alias") + end + kernel = copy_kernel(backend) + kernel(A, B, ndrange = length(A)) + return A + else + return Base.copyto!(A, B) + end +end -## Memory Operations +KA.functional(::POCLBackend) = true +KA.pagelock!(::POCLBackend, x) = nothing -# function KA.copyto!(::POCLBackend, A, B) -# copyto!(A, B) -# # TODO: Address device to host copies in jl being synchronizing -# end +KA.get_backend(::Array) = POCLBackend() +KA.synchronize(::POCLBackend) = nothing +KA.supports_float64(::POCLBackend) = true ## Kernel Launch diff --git a/src/pocl/pocl.jl b/src/pocl/pocl.jl index 796aa779..a5c68b7b 100644 --- a/src/pocl/pocl.jl +++ b/src/pocl/pocl.jl @@ -67,7 +67,6 @@ import .POCLKernels: POCLBackend export POCLBackend import KernelAbstractions as KA -KA.get_backend(::Array) = POCLBackend() Adapt.adapt_storage(::POCLBackend, a::Array) = a