Skip to content

Commit ffa8d09

Browse files
committed
GPU support for steadystate_fourier
1 parent b6efc43 commit ffa8d09

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

ext/QuantumToolboxCUDAExt.jl

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ module QuantumToolboxCUDAExt
33
using QuantumToolbox
44
using QuantumToolbox: makeVal, getVal
55
import QuantumToolbox: _sparse_similar, _convert_eltype_wordsize
6-
import CUDA: cu, CuArray, allowscalar
6+
import CUDA: cu, CuArray, allowscalar, @allowscalar, has_cuda
77
import CUDA.CUSPARSE: CuSparseVector, CuSparseMatrixCSC, CuSparseMatrixCSR, AbstractCuSparseArray
8-
import SparseArrays: SparseVector, SparseMatrixCSC, sparse
8+
import SparseArrays: SparseVector, SparseMatrixCSC, sparse, spzeros
99
import CUDA.Adapt: adapt
1010

11+
export _safe_setindex!
12+
1113
allowscalar(false)
1214

1315
@doc raw"""
@@ -104,5 +106,10 @@ QuantumToolbox.to_dense(::Type{T}, A::AbstractCuSparseArray) where {T<:Number} =
104106

105107
QuantumToolbox._sparse_similar(A::CuSparseMatrixCSC, args...) = sparse(args..., fmt = :csc)
106108
QuantumToolbox._sparse_similar(A::CuSparseMatrixCSR, args...) = sparse(args..., fmt = :csr)
107-
109+
_sparse_similar(A::CuSparseMatrixCSC, I::AbstractVector, J::AbstractVector, V::AbstractVector, m::Int, n::Int) =
110+
CuSparseMatrixCSC(sparse(I, J, V, m, n))
111+
_sparse_similar(A::CuSparseMatrixCSC, m::Int, n::Int) = CuSparseMatrixCSC(spzeros(eltype(A), m, n))
112+
_sparse_similar(A::CuSparseMatrixCSR, I::AbstractVector, J::AbstractVector, V::AbstractVector, m::Int, n::Int) =
113+
CuSparseMatrixCSR(sparse(I, J, V, m, n))
114+
_sparse_similar(A::CuSparseMatrixCSR, m::Int, n::Int) = CuSparseMatrixCSR(spzeros(eltype(A), m, n))
108115
end

src/utilities.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ _dense_similar(A::AbstractSparseMatrix, args...) = similar(nonzeros(A), args...)
135135

136136
_sparse_similar(A::AbstractArray, args...) = sparse(args...)
137137
_sparse_similar(A::AbstractArray, m::Int, n::Int) = spzeros(eltype(A), m, n)
138-
_sparse_similar(A::AbstractArray, rows, cols, vals, m::Int, n::Int) = sparse(rows, cols, vals, m, n)
139138

140139
_Ginibre_ensemble(n::Int, rank::Int = n) = randn(ComplexF64, n, rank) / sqrt(n)
141140

test/ext-test/gpu/cuda_ext.jl

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,27 @@ end
154154
@test ρ_ss_cpu.data Array(ρ_ss_gpu_csr.data) atol = 1e-8 * length(ρ_ss_cpu)
155155
end
156156

157+
@testset "CUDA steadystate_fourier" begin
158+
N = 2
159+
ωd = 1.0
160+
n_max = 2
161+
H0 = cu(sigmaz())
162+
Hp = cu(sigmax())
163+
Hm = cu(sigmax())
164+
c_ops = [cu(sqrt(0.1) * sigmam())]
165+
ρ_list1 = steadystate_fourier(H0, Hp, Hm, ωd, c_ops; solver = SteadyStateLinearSolver(), n_max = n_max)
166+
ρ0 = steadystate_fourier(
167+
H0,
168+
Hp,
169+
Hm,
170+
ωd,
171+
c_ops;
172+
solver = SSFloquetEffectiveLiouvillian(SteadyStateDirectSolver()),
173+
n_max = n_max,
174+
)
175+
@test isapprox(ρ0, ρ_list1[1]; atol = 1e-6)
176+
end
177+
157178
@testset "CUDA ptrace" begin
158179
g = fock(2, 1)
159180
e = fock(2, 0)

0 commit comments

Comments
 (0)