Parallelism#

We provide CPU multi-processing methods for circuit evaluation for multiple input states and multiple parameters for fixed input state.

When using the methods below the processes option controls the number of processes used by the parallel algorithms through the multiprocessing library. By default processes=None, in this case the total number of logical cores are used. Make sure to select the appropriate number of processes for your computer specification, taking in consideration memory and physical cores. In order to obtain optimal results you can control the number of threads used by each process with the qibo.set_threads method. For example, for small-medium size circuits you may benefit from single thread per process, thus set qibo.set_threads(1) before running the optimization.

Resources for parallel circuit evaluation.

qibo.parallel.parallel_execution(circuit, states, processes=None, backend=None)[source]#

Execute circuit for multiple states.

Example

import qibo
qibo.set_backend('qibojit')
from qibo import set_threads
from qibo.models import QFT
from qibo.parallel import parallel_execution
import numpy as np
# create circuit
nqubits = 22
circuit = QFT(nqubits)
# create random states
states = [ np.random.random(2**nqubits) for _ in range(5)]
# set threads to 1 per process (optional, requires tuning)
set_threads(1)
# execute in parallel
results = parallel_execution(circuit, states, processes=2)
Parameters:
  • circuit (qibo.models.Circuit) – the input circuit.

  • states (list) – list of states for the circuit evaluation.

  • processes (int, optional) – number of processes for parallel evaluation. If None, defaults to \(1\). Defaults to None.

Returns:

Circuit evaluation for input states.

qibo.parallel.parallel_circuits_execution(circuits, states=None, nshots=1000, processes=None, backend=None)[source]#

Execute multiple circuits

Example

import qibo
qibo.set_backend('qibojit')
from qibo import set_threads
from qibo.models import QFT
from qibo.parallel import parallel_circuits_execution
import numpy as np
# create different circuits
circuits = [QFT(n) for n in range(5, 16)]
# set threads to 1 per process (optional, requires tuning)
set_threads(1)
# execute in parallel
results = parallel_circuits_execution(circuits, processes=2)
Parameters:
  • circuits (list) – list of circuits to execute.

  • states (optional, list) – list of states to use as initial for each circuit. Must have the same length as circuits. If one state is given it is used on all circuits. If not given the default initial state on all circuits.

  • nshots (int) – Number of shots when performing measurements, same for all circuits.

  • processes (int) – number of processes for parallel evaluation.

Returns:

Circuit evaluation for input states.

qibo.parallel.parallel_parametrized_execution(circuit, parameters, initial_state=None, processes=None, backend=None)[source]#

Execute circuit for multiple parameters and fixed initial_state.

Example

import numpy as np

from qibo import Circuit, gates, set_backend, set_threads
from qibo.parallel import parallel_parametrized_execution

set_backend('qibojit')

# create circuit
nqubits = 6
nlayers = 2
circuit = Circuit(nqubits)
for l in range(nlayers):
    circuit.add((gates.RY(q, theta=0) for q in range(nqubits)))
    circuit.add((gates.CZ(q, q+1) for q in range(0, nqubits-1, 2)))
    circuit.add((gates.RY(q, theta=0) for q in range(nqubits)))
    circuit.add((gates.CZ(q, q+1) for q in range(1, nqubits-2, 2)))
    circuit.add(gates.CZ(0, nqubits-1))
circuit.add((gates.RY(q, theta=0) for q in range(nqubits)))
# create random parameters
size = len(circuit.get_parameters())
parameters = [ np.random.uniform(0, 2*np.pi, size) for _ in range(10) ]
# set threads to 1 per process (optional, requires tuning)
set_threads(1)
# execute in parallel
results = parallel_parametrized_execution(circuit, parameters, processes=2)
Parameters:
  • circuit (qibo.models.Circuit) – the input circuit.

  • parameters (list) – list of parameters for the circuit evaluation.

  • initial_state (ndarray) – initial state for the circuit evaluation.

  • processes (int) – number of processes for parallel evaluation. This corresponds to the number of threads, if a single thread is used for each circuit evaluation. If more threads are used for each circuit evaluation then some tuning may be required to obtain optimal performance. Default is None which corresponds to a single thread.

Returns:

Circuit evaluation for input parameters.