Backend CUDA

El backend CUDA 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ó

pip install qilisdk[cuda12]   # or [cuda13]

Inici ràpid

import numpy as np
from qilisdk.digital import Circuit, H, RX, CNOT
from qilisdk.backends import CudaBackend, CudaSamplingMethod
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 = CudaBackend(sampling_method=CudaSamplingMethod.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 CudaSamplingMethod. 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

🟡

The CudaBackend does not natively implement Backend._execute_quantum_reservoir. Circuit steps inside the reservoir layer fall back to dense QTensor unitary multiplication on CPU; Schedule steps still use CUDA-Q’s evolve. Any attached noise model is ignored.

VariationalProgram

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

Configuració

The CUDA backend exposes a single configuration parameter — CudaSamplingMethod — that selects the underlying CUDA-Q target used for digital circuits. Analog evolution always runs on the dynamics target and ignores this setting.

Mètode

Target de CUDA-Q (i fallback)

Per defecte

STATE_VECTOR

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

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.

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

from qilisdk.backends import CudaBackend, CudaSamplingMethod

backend = CudaBackend(sampling_method=CudaSamplingMethod.MATRIX_PRODUCT_STATE)

Suport de models de soroll

Es pot passar un NoiseModel a CudaBackend(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 CudaBackend, CudaSamplingMethod
from qilisdk.noise import NoiseModel, Depolarizing

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

backend = CudaBackend(
    sampling_method=CudaSamplingMethod.STATE_VECTOR,
    noise_model=nm,
)