From 4aec8f6566086d6fa0294ff1340b2dad002f910d Mon Sep 17 00:00:00 2001 From: Qingyu Li Date: Mon, 31 Mar 2025 23:25:51 +0800 Subject: [PATCH 1/3] Update libcustatevec.jl fix the type error in custatevecComputeExpectationBatched --- lib/custatevec/src/libcustatevec.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/custatevec/src/libcustatevec.jl b/lib/custatevec/src/libcustatevec.jl index ef51ca4bd5..62b72e6548 100644 --- a/lib/custatevec/src/libcustatevec.jl +++ b/lib/custatevec/src/libcustatevec.jl @@ -1000,7 +1000,7 @@ end nIndexBits::UInt32, nSVs::UInt32, svStride::custatevecIndex_t, - matrices::Ptr{Cvoid}, + matrices::PtrOrCuPtr{Cvoid}, matrixDataType::cudaDataType_t, layout::custatevecMatrixLayout_t, nMatrices::UInt32, @@ -1018,20 +1018,20 @@ end extraWorkspaceSizeInBytes) initialize_context() @gcsafe_ccall libcustatevec.custatevecComputeExpectationBatched(handle::custatevecHandle_t, - batchedSv::Ptr{Cvoid}, + batchedSv::CuPtr{Cvoid}, svDataType::cudaDataType_t, nIndexBits::UInt32, nSVs::UInt32, svStride::custatevecIndex_t, - expectationValues::Ptr{ComplexF64}, - matrices::Ptr{Cvoid}, + expectationValues::PtrOrCuPtr{ComplexF64}, + matrices::PtrOrCuPtr{Cvoid}, matrixDataType::cudaDataType_t, layout::custatevecMatrixLayout_t, nMatrices::UInt32, basisBits::Ptr{Int32}, nBasisBits::UInt32, computeType::custatevecComputeType_t, - extraWorkspace::Ptr{Cvoid}, + extraWorkspace::CuPtr{Cvoid}, extraWorkspaceSizeInBytes::Csize_t)::custatevecStatus_t end From 4aa93a988c2bc84b1a3d575e8b74b93442ed29dd Mon Sep 17 00:00:00 2001 From: Qingyu Li Date: Mon, 31 Mar 2025 23:29:45 +0800 Subject: [PATCH 2/3] Update statevec.jl Add new API for expectationBatched and measureBatched! --- lib/custatevec/src/statevec.jl | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lib/custatevec/src/statevec.jl b/lib/custatevec/src/statevec.jl index 765605e5f2..d838bff356 100644 --- a/lib/custatevec/src/statevec.jl +++ b/lib/custatevec/src/statevec.jl @@ -107,6 +107,17 @@ function batchMeasure!(sv::CuStateVec, bitordering::Vector{<:Integer}, randnum:: return sv, bitstring end +function measureBatched!(sv::CuStateVec, n_svs::Int, bitordering::Vector{<:Integer},randnums::Vector{<:Integer}, collapse::custatevecCollapseOp_t=CUSTATEVEC_COLLAPSE_NONE) + + all(0.0 .<= randnums .< 1.0) && length(randnums) == n_svs || throw(ArgumentError("randnums must have length $nsvs and all elements must be in the interval [0, 1).")) + + bitStrings = zeros(Int32, length(bitordering)*n_svs) + sv_stride = div(length(sv.data), n_svs) + n_index_bits = Int(log2(div(length(sv.data), n_svs))) + custatevecMeasureBatched(handle(), sv.data, eltype(sv), n_index_bits, n_svs, sv_stride, bitStrings, convert(Vector{Int32}, bitordering), length(bitstring), randnums, collapse) + return sv, bitstrings +end + function batchMeasureWithOffset!(sv::CuStateVec, bitordering::Vector{<:Integer}, randnum::Float64, offset::Float64, abs2sum::Float64, collapse::custatevecCollapseOp_t=CUSTATEVEC_COLLAPSE_NONE) 0.0 <= randnum < 1.0 || throw(ArgumentError("randnum $randnum must be in the interval [0, 1).")) bitstring = zeros(Int32, length(bitordering)) @@ -128,6 +139,21 @@ function expectation(sv::CuStateVec, matrix::Union{Matrix, CuMatrix}, basis_bits return expVal[], residualNorm[] end +function expectationBatched(sv::CuStateVec, n_svs::Int, matrix::Union{CuVector, Vector}, n_matrices::Int, basis_bits::Vector{<:Integer}) + sv_stride = div(length(sv.data), n_svs) + n_index_bits = Int(log2(div(length(sv.data), n_svs))) + function bufferSize() + out = Ref{Csize_t}() + custatevecComputeExpectationBatchedGetWorkspaceSize(handle(), eltype(sv), n_index_bits, n_svs, sv_stride, matrix, eltype(matrix), CUSTATEVEC_MATRIX_LAYOUT_COL, n_matrices, length(basis_bits), compute_type(eltype(sv), eltype(matrix)), out) + out[] + end + expVals = zeros(ComplexF64, n_matrices*n_svs) + with_workspace(handle().cache, bufferSize) do buffer + custatevecComputeExpectationBatched(handle(), sv.data, eltype(sv), n_index_bits, n_svs, sv_stride, expVals, matrix, eltype(matrix), CUSTATEVEC_MATRIX_LAYOUT_COL, n_matrices, convert(Vector{Int32}, basis_bits), length(basis_bits), compute_type(eltype(sv), eltype(matrix)), buffer, sizeof(buffer)) + end + return expVals +end + function expectationsOnPauliBasis(sv::CuStateVec, pauliOps::Vector{Vector{Pauli}}, basisInds::Vector{Vector{Int}}) exp_vals = zeros(Float64, length(pauliOps)) cupaulis = [[CuStateVecPauli(O) for O in op] for op in pauliOps] From 1207c36daaded169a009fbecd4a36860bef5aca4 Mon Sep 17 00:00:00 2001 From: Qingyu Li Date: Tue, 1 Apr 2025 01:18:29 +0800 Subject: [PATCH 3/3] Update statevec.jl fixed format --- lib/custatevec/src/statevec.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/custatevec/src/statevec.jl b/lib/custatevec/src/statevec.jl index d838bff356..722680d8ef 100644 --- a/lib/custatevec/src/statevec.jl +++ b/lib/custatevec/src/statevec.jl @@ -108,9 +108,7 @@ function batchMeasure!(sv::CuStateVec, bitordering::Vector{<:Integer}, randnum:: end function measureBatched!(sv::CuStateVec, n_svs::Int, bitordering::Vector{<:Integer},randnums::Vector{<:Integer}, collapse::custatevecCollapseOp_t=CUSTATEVEC_COLLAPSE_NONE) - all(0.0 .<= randnums .< 1.0) && length(randnums) == n_svs || throw(ArgumentError("randnums must have length $nsvs and all elements must be in the interval [0, 1).")) - bitStrings = zeros(Int32, length(bitordering)*n_svs) sv_stride = div(length(sv.data), n_svs) n_index_bits = Int(log2(div(length(sv.data), n_svs)))