Backend CUDA-Q

El backend CUDA-Q aprofita les GPU NVIDIA mitjançant el marc cuda-quantum. Quan no es detecta cap GPU compatible, recau de manera transparent en un target de CPU, de manera que el mateix codi prototipat en un portàtil també funcionarà en una màquina accelerada.

Instal·lació

CUDA-Q no es distribueix amb QiliSDK; instal·leu vosaltres mateixos la versió que correspongui al vostre toolkit de CUDA i el backend quedarà disponible:

pip install "cuda-quantum-cu12>=0.14.0"   # or cuda-quantum-cu13

Nota

CudaqBackend requereix CUDA-Q 0.14.0 o posterior. CUDA-Q no publica wheels per a Python 3.14, de manera que el backend no hi està disponible fins que ho faci.

Inici ràpid

import numpy as np
from qilisdk.digital import Circuit, H, RX, CNOT
from qilisdk.backends import CudaqBackend, CudaqSamplingMethod
from qilisdk.functionals import DigitalPropagation
from qilisdk.readout import Readout

circuit = Circuit(2)
circuit.add(RX(0, theta=np.pi / 4))
circuit.add(H(0))
circuit.add(CNOT(0, 1))

backend = CudaqBackend(sampling_method=CudaqSamplingMethod.STATE_VECTOR)
result = backend.execute(DigitalPropagation(circuit), Readout().with_sampling(nshots=500))
print(result.get_samples())

Suport de funcionals

Funcional

Suport

Notes

DigitalPropagation

Kernel CUDA-Q natiu. El mètode de mostreig se selecciona mitjançant CudaqSamplingMethod. Les mesures intermèdies llancen NotImplementedError.

AnalogEvolution

Impulsada per cudaq.evolve sobre el target dynamics (sempre accelerada per GPU quan està disponible, independentment del mètode de mostreig digital).

QuantumReservoir

🟡

CudaqBackend no implementa Backend._execute_quantum_reservoir. Els passos Circuit dins de la capa del reservori recauen en una multiplicació unitària QTensor densa a CPU; els passos Schedule segueixen utilitzant evolve de CUDA-Q. Qualsevol model de soroll adjuntat s’ignora.

VariationalProgram

Reutilitza els manejadors digital/analògic anteriors a cada pas d’optimització.

Configuració

El backend CUDA exposa un únic paràmetre de configuració — CudaqSamplingMethod — que selecciona el target subjacent de CUDA-Q utilitzat per als circuits digitals. Si no s’especifica cap mètode, s’utilitza STATE_VECTOR. L’evolució analògica sempre s’executa sobre el target dynamics i ignora aquesta opció.

Mètode

Target de CUDA-Q

Admet mostreig

Admet valors esperats

Admet tomografia d’estat

STATE_VECTOR

nvidia quan hi ha una GPU disponible, en cas contrari qpp-cpu. La precisió coincideix amb Precision.

STATE_VECTOR_MGPU

nvidia-mgpu quan hi ha diverses GPUs disponibles, en cas contrari recau a nvidia.

TENSOR_NETWORK

tensornet. Adequat per a circuits poc profunds però amples.

MATRIX_PRODUCT_STATE

tensornet-mps. Adequat per a circuits llargs amb baix entrelaçament.

CPU

cpu. Força l’execució a la CPU. Útil principalment per a benchmarking.

Definiu el mètode en el moment de la construcció:

from qilisdk.backends import CudaqBackend, CudaqSamplingMethod

backend = CudaqBackend(sampling_method=CudaqSamplingMethod.MATRIX_PRODUCT_STATE)

Alguns mètodes de simulació de CUDA admeten establir paràmetres mitjançant variables d’entorn, especialment els mètodes MATRIX_PRODUCT_STATE i TENSOR_NETWORK. Consulteu la documentació de CUDA-Q per a més detalls.

Per definir la precisió de la simulació, utilitzeu l’objecte Settings:

from qilisdk.settings import get_settings, Precision

settings = get_settings()
settings.complex_precision = Precision.COMPLEX_64  # or COMPLEX_32

Suport de models de soroll

Es pot passar un NoiseModel a CudaqBackend(noise_model=…):

  • Per a DigitalPropagation, els canals de soroll de qilisdk es tradueixen a un cudaq.NoiseModel (canals de Kraus per a soroll estàtic o derivat del temps, pertorbacions de paràmetres aplicades al circuit). Amb soroll activat, només s’admet una única SamplingReadout.

  • Per a AnalogEvolution, els canals de soroll compatibles amb Lindblad esdevenen operadors de salt de CUDA-Q i deltes del Hamiltonià que es passen a cudaq.evolve.

  • Per a QuantumReservoir, la implementació de fallback descarta el model de soroll (s’emet un avís al registre).

Exemple: un canal despolaritzador aplicat a cada porta d’un circuit digital:

from qilisdk.backends import CudaqBackend, CudaqSamplingMethod
from qilisdk.noise import NoiseModel, Depolarizing

nm = NoiseModel()
nm.add(Depolarizing(probability=1e-3))

backend = CudaqBackend(
    sampling_method=CudaqSamplingMethod.STATE_VECTOR,
    noise_model=nm,
)