Backend CUDA
El backend CUDA aprovecha las GPU de NVIDIA a través del framework cuda-quantum. Cuando no se detecta ninguna GPU compatible recae de forma transparente en un destino de CPU, de modo que el mismo código creado en un portátil también funcionará en una máquina con aceleración.
Instalación
pip install qilisdk[cuda12] # or [cuda13]
Inicio rápido
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())
Soporte de funcionales
Funcional |
Soporte |
Notas |
|---|---|---|
✅ |
Kernel CUDA-Q nativo. El método de muestreo se selecciona mediante |
|
✅ |
Impulsada por |
|
🟡 |
The CudaBackend does not natively implement |
|
✅ |
Reutiliza los manejadores digital/analógico anteriores en cada paso de optimización. |
Configuración
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étodo |
Target de CUDA-Q (y fallback) |
Por defecto |
|---|---|---|
|
✅ |
|
|
||
|
Defina el método en el momento de la construcción:
from qilisdk.backends import CudaBackend, CudaSamplingMethod
backend = CudaBackend(sampling_method=CudaSamplingMethod.MATRIX_PRODUCT_STATE)
Soporte de modelos de ruido
Puede pasarse un NoiseModel a CudaBackend(noise_model=…):
Para
DigitalPropagation, los canales de ruido de qilisdk se traducen a uncudaq.NoiseModel(canales de Kraus para ruido estático o derivado del tiempo, perturbaciones de parámetros aplicadas al circuito). Con ruido activado, solo se admite una únicaSamplingReadout.Para
AnalogEvolution, los canales de ruido compatibles con Lindblad se convierten en operadores de salto de CUDA-Q y en deltas del Hamiltoniano que se pasan acudaq.evolve.Para
QuantumReservoir, la implementación de fallback descarta el modelo de ruido (se emite un aviso en el log).
Ejemplo: un canal despolarizador aplicado a cada puerta de un circuito 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,
)