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 |
|---|---|---|
✅ |
Kernel CUDA-Q natiu. El mètode de mostreig se selecciona mitjançant |
|
✅ |
Impulsada per |
|
🟡 |
CudaqBackend no implementa |
|
✅ |
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 |
|---|---|---|---|---|
|
✅ |
✅ |
✅ |
|
|
✅ |
✅ |
✅ |
|
|
✅ |
❌ |
❌ |
|
|
✅ |
❌ |
❌ |
|
|
✅ |
✅ |
✅ |
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 uncudaq.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 únicaSamplingReadout.Per a
AnalogEvolution, els canals de soroll compatibles amb Lindblad esdevenen operadors de salt de CUDA-Q i deltes del Hamiltonià que es passen acudaq.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,
)