diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 99e14c44..9b5a46d6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -34,6 +34,7 @@ jobs: group: - CPU - JLArrays + - OpenCL uses: "SciML/.github/.github/workflows/tests.yml@master" with: julia-version: "${{ matrix.version }}" diff --git a/Project.toml b/Project.toml index b5733067..8efec9ea 100644 --- a/Project.toml +++ b/Project.toml @@ -30,6 +30,7 @@ AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" JLArrays = "27aeb0d3-9eb9-45fb-866b-73c2ecf80fcb" Metal = "dde4c033-4e86-420c-a63e-0dd931031962" +OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" [extensions] @@ -37,6 +38,7 @@ AMDGPUExt = ["AMDGPU"] CUDAExt = ["CUDA"] JLArraysExt = ["JLArrays"] MetalExt = ["Metal"] +OpenCLExt = ["OpenCL"] oneAPIExt = ["oneAPI"] [compat] @@ -53,6 +55,7 @@ KernelAbstractions = "0.9" LinearSolve = "3" Metal = "1" MuladdMacro = "0.2" +OpenCL = "0.9, 0.10" Parameters = "0.12" RecursiveArrayTools = "3" SciMLBase = "2.92" @@ -70,5 +73,7 @@ CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" JLArrays = "27aeb0d3-9eb9-45fb-866b-73c2ecf80fcb" Metal = "dde4c033-4e86-420c-a63e-0dd931031962" -oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" +OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" +pocl_jll = "627d6b7a-bbe6-5189-83e7-98cc0a5aeadd" diff --git a/README.md b/README.md index cdf4e30a..8df6285b 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,7 @@ SciML's GPU support extends to a wide array of hardware, including: | AMD | ROCm | [AMDGPU.jl](https://github.com/JuliaGPU/AMDGPU.jl) | `AMDGPU.ROCBackend()` | | Intel | OneAPI | [OneAPI.jl](https://github.com/JuliaGPU/oneAPI.jl) | `oneAPI.oneAPIBackend()` | | Apple (M-Series) | Metal | [Metal.jl](https://github.com/JuliaGPU/Metal.jl) | `Metal.MetalBackend()` | +| CPU (fast kernels) | OpenCL | [OpenCL.jl](https://github.com/JuliaGPU/OpenCL.jl) | `OpenCL.CLBackend()` | For this tutorial we will demonstrate the CUDA backend for NVIDIA GPUs, though any of the other GPUs can be used by simply swapping out the `backend` choice. diff --git a/ext/OpenCLExt.jl b/ext/OpenCLExt.jl new file mode 100644 index 00000000..c2a038bf --- /dev/null +++ b/ext/OpenCLExt.jl @@ -0,0 +1,11 @@ +module OpenCLExt +using OpenCL +import DiffEqGPU + +using .OpenCL +import .OpenCL: OpenCLBackend + +DiffEqGPU.maxthreads(::OpenCLBackend) = 256 +DiffEqGPU.maybe_prefer_blocks(::OpenCLBackend) = OpenCLBackend() + +end diff --git a/test/Project.toml b/test/Project.toml index 6e853ca2..6c2c0ed1 100644 --- a/test/Project.toml +++ b/test/Project.toml @@ -8,15 +8,17 @@ ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" JLArrays = "27aeb0d3-9eb9-45fb-866b-73c2ecf80fcb" LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" Optimization = "7f7a1694-90dd-40f0-9382-eb1efda571ba" OptimizationOptimisers = "42dfb2eb-d2b4-4451-abcd-913932933ac1" OrdinaryDiffEq = "1dea7af3-3e70-54e6-95c3-0bf5283fa5ed" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" SafeTestsets = "1bc83da4-3b8d-516f-aca4-4fe02f6d838f" +SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" Statistics = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" StochasticDiffEq = "789caeaf-c7a9-5a7d-9973-96adeb23e2a0" -SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" Zygote = "e88e6eb3-aa80-5325-afca-941959d7151f" +pocl_jll = "627d6b7a-bbe6-5189-83e7-98cc0a5aeadd" diff --git a/test/utils.jl b/test/utils.jl index a60bb9e0..b89b9d16 100644 --- a/test/utils.jl +++ b/test/utils.jl @@ -11,6 +11,9 @@ elseif GROUP == "oneAPI" elseif GROUP == "Metal" using Metal Metal.MetalBackend() +elseif GROUP == "OpenCL" + using OpenCL, pocl_jll + OpenCL.OpenCLBackend() elseif GROUP == "JLArrays" using JLArrays JLArrays.JLBackend()