diff --git a/README.md b/README.md index 2d807c7..8c52419 100644 --- a/README.md +++ b/README.md @@ -68,7 +68,7 @@ pixi run plot # Run benchmarks and plot their results in data/ from qlabs.base import StateVector, Hadamard, SWAP, NOT, PauliY, PauliZ from qlabs.abstractions import GateCircuit, StateVectorSimulator, ShowAfterEachGate -num_qubits = 3 +alias num_qubits = 3 qc = GateCircuit(num_qubits) qc.apply_gates( @@ -92,11 +92,31 @@ print("Quantum circuit created:\n", qc) # Visualization not fully implemented qsimu = StateVectorSimulator( qc, initial_state=StateVector.from_bitstring("0" * num_qubits), - use_gpu_if_available=True, # GPU support not fully implemented + use_gpu_if_available=False, verbose=True, verbose_step_size=ShowAfterEachGate, # Options: ShowAfterEachGate, ShowOnlyEnd ) +# GPU usage +# The StateVectorSimulator currently does not support GPU with control gates fully. +# The lower-level function `qubit_wise_multiply()` is correctly implemented for GPU. +# qsimu = StateVectorSimulator[ +# gpu_num_qubits=num_qubits, +# gpu_gate_ordered_set= [Hadamard, NOT, PauliY, PauliZ], +# gpu_control_gate_count=3, # Planned to be automated +# gpu_control_bits_list= [ +# [[2, 0]], +# [[1, 1]], +# [[0, 1]], +# ], # Planned to be automated +# ]( +# qc, +# initial_state=StateVector.from_bitstring("0" * num_qubits), +# use_gpu_if_available=True, +# verbose=True, +# verbose_step_size=ShowOnlyEnd, +# ) + final_state = qsimu.run() print("Final quantum state:\n", final_state) diff --git a/examples/circuit_level.mojo b/examples/circuit_level.mojo index 13192f3..843f12b 100644 --- a/examples/circuit_level.mojo +++ b/examples/circuit_level.mojo @@ -56,26 +56,27 @@ fn simulate_figure1_circuit_abstract() -> None: # Create the initial state |000⟩ initial_state: StateVector = StateVector.from_bitstring("000") + # Simulating using CPU qsimu = StateVectorSimulator( qc, initial_state=initial_state, - use_gpu_if_available=True, + use_gpu_if_available=False, verbose=True, - verbose_step_size=ShowOnlyEnd, # ShowAfterEachGate, ShowAfterEachLayer + verbose_step_size=ShowOnlyEnd, # or ShowAfterEachGate, ShowAfterEachLayer ) - # # For GPU (NOTE: Doesn't work currently as GPU doesn't fully support control bits) + # # Simulating using GPU # qsimu = StateVectorSimulator[ # gpu_num_qubits=num_qubits, # gpu_gate_ordered_set= [Hadamard, PauliZ, NOT], # gpu_control_gate_count=2, - # gpu_control_bits_list= [[[1, 1], [1, 1]]], + # gpu_control_bits_list= [[[1, 1]], [[1, 1]]], # ]( # qc, # initial_state=initial_state, # use_gpu_if_available=True, # verbose=True, - # verbose_step_size=ShowOnlyEnd, # ShowAfterEachGate, ShowAfterEachLayer + # verbose_step_size=ShowOnlyEnd, # ) state = qsimu.run() @@ -122,7 +123,9 @@ fn simulate_figure4_circuit_abstract() -> None: print("Final quantum state:\n", final_state) -fn simulate_random_circuit[number_qubits: Int](number_layers: Int) -> None: +fn simulate_random_circuit[ + number_qubits: Int, use_gpu: Bool = True +](number_layers: Int) -> None: """Simulates a random quantum circuit with the specified number of qubits and layers. Parameters: @@ -167,7 +170,7 @@ fn simulate_random_circuit[number_qubits: Int](number_layers: Int) -> None: ]( qc, initial_state=quantum_state, - use_gpu_if_available=True, + use_gpu_if_available=use_gpu, verbose=False, ) diff --git a/examples/main.mojo b/examples/main.mojo index 551f098..d49e361 100644 --- a/examples/main.mojo +++ b/examples/main.mojo @@ -46,7 +46,9 @@ def main(): print("=========================================") print("circuit_level: simulate_random_circuit()") - simulate_random_circuit[number_qubits=20](number_layers=5) + simulate_random_circuit[number_qubits=20, use_gpu=True]( + number_layers=5, + ) print("=========================================") print("circuit_level: simulate_figure4_circuit_abstract()") diff --git a/img/benchmark_H100.png b/img/benchmark_H100.png index 0dfea41..8ce2564 100644 Binary files a/img/benchmark_H100.png and b/img/benchmark_H100.png differ