Qiskit¶
cuQuantum Appliance contains Qiskit and cusvaer. cusvaer is seamlessly integrated into Qiskit Aer, so that users are able to use run multi-node simulations through Qiskit Aer without any modifications to their source code.
For details of the cusvaer backend solver, please refer to cusvaer.
Getting started¶
The following python script is an example to run Greenberger–Horne–Zeilinger (GHZ) circuit.
from qiskit import QuantumCircuit, transpile
from qiskit_aer import Aer
def create_ghz_circuit(n_qubits):
circuit = QuantumCircuit(n_qubits)
circuit.h(0)
for qubit in range(n_qubits - 1):
circuit.cx(qubit, qubit + 1)
return circuit
simulator = Aer.get_backend('aer_simulator_statevector')
circuit = create_ghz_circuit(n_qubits=20)
circuit.measure_all()
circuit = transpile(circuit, simulator)
job = simulator.run(circuit)
result = job.result()
print(result.get_counts())
print(f'backend: {result.backend_name}')
This script works with Qiskit Aer. When the script is executed in the current version of cuQuantum Appliance, the multi-node backend is automatically selected and runs the simulation. The backend name is "cusvaer_simulator_statevector"
.
$ python ghz.py
{'00000000000000000000': 493, '11111111111111111111': 531}
backend: cusvaer_simulator_statevector
By launching a script with mpirun, simulation will be distributed to multiple processes. In the following examples, two processes are used for simulation, and result will be output twice.
$ mpirun -n 2 python ghz.py
{'00000000000000000000': 536, '11111111111111111111': 488}
cusvaer_simulator_statevector
{'00000000000000000000': 536, '11111111111111111111': 488}
cusvaer_simulator_statevector
By adding the lines shown below, the process where mpi_rank == 0
is selected to output the result.
if result.mpi_rank == 0:
print(result.get_counts())
print(f'backend: {result.backend_name}')
$ mpirun -n 2 python ghz.py
{'00000000000000000000': 532, '11111111111111111111': 492}
cusvaer_simulator_statevector
Note
The qiskit_aer.Aer
object is available in Qiskit 1.0. For previous versions of Qiskit, qiskit.Aer
works in the same way.
Note
GHZ circuit is used here as an example, which does not mean for demonstrating performance. It is known that the GHZ circuit is too shallow to show good scaling when simulation is distributed to multiple-GPUs and/or multiple-nodes.
Selecting simulator¶
The current version of Qiskit Aer installed in cuQuantum Appliance is extended to instantiate the cusvaer backend solver when all the following conditions are met:
cusvaer_enable == True
method == "statevector" or method == "automatic"
noise_model == None
cusvaer_enable
is an extension to Qiskit Aer that enables cusvaer. The default value is True
. The method
and noise_model
are options provided by Qiskit Aer. cusvaer is selected only if the noise_model
option is None
as the first release of cusvaer does not support noise model.
cusvaer-specific options¶
Please refer to cusvaer options.
Modifications for Qiskit Aer options¶
The following table shows the modified and added options to Qiskit Aer.
Option |
Description |
|
If set to |
|
The default value is changed to |
|
The default value is changed to |
Interoperability with mpi4py¶
mpi4py is interoperable with cusvaer backend. Please refer to Interoperability with mpi4py for details.
Limitations¶
The current release version has the following limitations:
Noise model and noisy circuit simulations are not supported.
Simulations are executed in serial even if Qiskit Aer’s parallel simulation options (e.g.,
batched_shots_gpu
,batched_shots_gpu_max_qubits
) are provided.Single-process multi-GPU simulation is not supported. Users need to launch multiple MPI processes even in a single node.