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

DigitalPropagation

Kernel CUDA-Q nativo. El método de muestreo se selecciona mediante CudaSamplingMethod. Las mediciones intermedias lanzan NotImplementedError.

AnalogEvolution

Impulsada por cudaq.evolve sobre el target dynamics (siempre acelerada por GPU cuando está disponible, con independencia del método de muestreo 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

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

STATE_VECTOR

nvidia (GPU) cuando hay una GPU disponible; en caso contrario qpp-cpu. La precisión coincide con Precision.

TENSOR_NETWORK

tensornet. Adecuado para circuitos poco profundos pero anchos.

MATRIX_PRODUCT_STATE

tensornet-mps. Adecuado para circuitos largos con bajo entrelazamiento.

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 un cudaq.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 única SamplingReadout.

  • 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 a cudaq.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,
)