From e344dc818e3d4d2e39d4b61d3d0c105c41a4fa00 Mon Sep 17 00:00:00 2001 From: patataman Date: Fri, 19 May 2023 15:16:53 +0900 Subject: [PATCH 1/5] mps parallel prob meas + test --- .../matrix_product_state.hpp | 3 ++- .../matrix_product_state_internal.cpp | 7 +++++-- .../backends/aer_simulator/test_measure.py | 18 ++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/simulators/matrix_product_state/matrix_product_state.hpp b/src/simulators/matrix_product_state/matrix_product_state.hpp index 4105fd3bdf..997232da4d 100644 --- a/src/simulators/matrix_product_state/matrix_product_state.hpp +++ b/src/simulators/matrix_product_state/matrix_product_state.hpp @@ -788,6 +788,7 @@ std::vector State::sample_measure_all(uint_t shots, RngEngine &rng) { std::vector all_samples; all_samples.resize(shots); + #pragma omp parallel for if (getenv("PRL_PROB_MEAS")) for (uint_t i = 0; i < shots; i++) { auto single_result = qreg_.sample_measure(shots, rng); all_samples[i] = single_result; @@ -813,4 +814,4 @@ std::pair State::sample_measure_with_prob(const reg_t &qubits, //------------------------------------------------------------------------- } // end namespace AER //------------------------------------------------------------------------- -#endif \ No newline at end of file +#endif diff --git a/src/simulators/matrix_product_state/matrix_product_state_internal.cpp b/src/simulators/matrix_product_state/matrix_product_state_internal.cpp index b98e793ab2..2bfe9d0023 100644 --- a/src/simulators/matrix_product_state/matrix_product_state_internal.cpp +++ b/src/simulators/matrix_product_state/matrix_product_state_internal.cpp @@ -1640,8 +1640,11 @@ reg_t MPS::sample_measure(uint_t shots, RngEngine &rng) const { reg_t current_measure(num_qubits_); cmatrix_t mat; rvector_t rnds(num_qubits_); - for (uint_t i = 0; i < num_qubits_; ++i) { - rnds[i] = rng.rand(0., 1.); + #pragma omp critical + { + for (uint_t i = 0; i < num_qubits_; ++i) { + rnds[i] = rng.rand(0., 1.); + } } for (uint_t i = 0; i < num_qubits_; i++) { current_measure[i] = sample_measure_single_qubit(i, prob, rnds[i], mat); diff --git a/test/terra/backends/aer_simulator/test_measure.py b/test/terra/backends/aer_simulator/test_measure.py index f3a495befd..0b24209e19 100644 --- a/test/terra/backends/aer_simulator/test_measure.py +++ b/test/terra/backends/aer_simulator/test_measure.py @@ -24,6 +24,8 @@ from qiskit.quantum_info.random import random_unitary from test.terra.backends.simulator_test_case import SimulatorTestCase, supported_methods +import os + SUPPORTED_METHODS = [ "automatic", "stabilizer", @@ -264,6 +266,22 @@ def test_mps_measure_subset_alg_qv(self): result1.get_counts(circuit), result2.get_counts(circuit), delta=0.1 * shots ) + # Test also parallel version + os.environ["PRL_PROB_MEAS"] = "1" + result2_prl = backend.run( + circuit, shots=shots, mps_sample_measure_algorithm="mps_probabilities" + ).result() + self.assertTrue(getattr(result2_prl, "success", "True")) + os.unsetenv("PRL_PROB_MEAS") + + self.assertDictAlmostEqual( + result1.get_counts(circuit), result2_prl.get_counts(circuit), delta=0.1 * shots + ) + self.assertDictAlmostEqual( + result2.get_counts(circuit), result2_prl.get_counts(circuit), delta=0.1 * shots + ) + + def test_mps_measure_with_limited_bond_dimension(self): """Test MPS measure with limited bond dimension, where the qubits are not in sorted order From 6a10e4050fd559c7e7b840bc0efef78d1a5b1a36 Mon Sep 17 00:00:00 2001 From: patataman Date: Thu, 10 Aug 2023 12:05:50 +0900 Subject: [PATCH 2/5] code style and releasenote for PR --- ...allel-probabilistic-measurement-mps-ec00a896a0322213.yaml | 5 +++++ src/simulators/matrix_product_state/matrix_product_state.hpp | 2 +- .../matrix_product_state/matrix_product_state_internal.cpp | 2 +- test/terra/backends/aer_simulator/test_measure.py | 1 - 4 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml diff --git a/releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml b/releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml new file mode 100644 index 0000000000..980f979f88 --- /dev/null +++ b/releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml @@ -0,0 +1,5 @@ +--- +upgrade: + - | + Improve performance in MPS measurement method ``matrix_product_state::sample_measure_all`` + parallelizing the shots. diff --git a/src/simulators/matrix_product_state/matrix_product_state.hpp b/src/simulators/matrix_product_state/matrix_product_state.hpp index 997232da4d..99e63c5335 100644 --- a/src/simulators/matrix_product_state/matrix_product_state.hpp +++ b/src/simulators/matrix_product_state/matrix_product_state.hpp @@ -788,7 +788,7 @@ std::vector State::sample_measure_all(uint_t shots, RngEngine &rng) { std::vector all_samples; all_samples.resize(shots); - #pragma omp parallel for if (getenv("PRL_PROB_MEAS")) +#pragma omp parallel for if (getenv("PRL_PROB_MEAS")) for (uint_t i = 0; i < shots; i++) { auto single_result = qreg_.sample_measure(shots, rng); all_samples[i] = single_result; diff --git a/src/simulators/matrix_product_state/matrix_product_state_internal.cpp b/src/simulators/matrix_product_state/matrix_product_state_internal.cpp index 2bfe9d0023..4109cebb29 100644 --- a/src/simulators/matrix_product_state/matrix_product_state_internal.cpp +++ b/src/simulators/matrix_product_state/matrix_product_state_internal.cpp @@ -1640,7 +1640,7 @@ reg_t MPS::sample_measure(uint_t shots, RngEngine &rng) const { reg_t current_measure(num_qubits_); cmatrix_t mat; rvector_t rnds(num_qubits_); - #pragma omp critical +#pragma omp critical { for (uint_t i = 0; i < num_qubits_; ++i) { rnds[i] = rng.rand(0., 1.); diff --git a/test/terra/backends/aer_simulator/test_measure.py b/test/terra/backends/aer_simulator/test_measure.py index 0b24209e19..bb9a99f4f0 100644 --- a/test/terra/backends/aer_simulator/test_measure.py +++ b/test/terra/backends/aer_simulator/test_measure.py @@ -281,7 +281,6 @@ def test_mps_measure_subset_alg_qv(self): result2.get_counts(circuit), result2_prl.get_counts(circuit), delta=0.1 * shots ) - def test_mps_measure_with_limited_bond_dimension(self): """Test MPS measure with limited bond dimension, where the qubits are not in sorted order From e1f9d88327a254f2cf47a1bdd07063760b13dfa0 Mon Sep 17 00:00:00 2001 From: patataman Date: Thu, 24 Aug 2023 02:41:40 +0000 Subject: [PATCH 3/5] fix C3016 --- src/simulators/matrix_product_state/matrix_product_state.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/simulators/matrix_product_state/matrix_product_state.hpp b/src/simulators/matrix_product_state/matrix_product_state.hpp index 99e63c5335..b910843094 100644 --- a/src/simulators/matrix_product_state/matrix_product_state.hpp +++ b/src/simulators/matrix_product_state/matrix_product_state.hpp @@ -789,7 +789,7 @@ std::vector State::sample_measure_all(uint_t shots, RngEngine &rng) { all_samples.resize(shots); #pragma omp parallel for if (getenv("PRL_PROB_MEAS")) - for (uint_t i = 0; i < shots; i++) { + for (int_t i = 0; i < static_cast(shots); i++) { auto single_result = qreg_.sample_measure(shots, rng); all_samples[i] = single_result; } From 4bf2f0674fa238a551e135ed528c211ed954cf5e Mon Sep 17 00:00:00 2001 From: patataman Date: Thu, 24 Aug 2023 13:50:37 +0900 Subject: [PATCH 4/5] change test to support windows python3.8 --- test/terra/backends/aer_simulator/test_measure.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/terra/backends/aer_simulator/test_measure.py b/test/terra/backends/aer_simulator/test_measure.py index bb9a99f4f0..5d8e750895 100644 --- a/test/terra/backends/aer_simulator/test_measure.py +++ b/test/terra/backends/aer_simulator/test_measure.py @@ -272,7 +272,8 @@ def test_mps_measure_subset_alg_qv(self): circuit, shots=shots, mps_sample_measure_algorithm="mps_probabilities" ).result() self.assertTrue(getattr(result2_prl, "success", "True")) - os.unsetenv("PRL_PROB_MEAS") + del os.environ["PRL_PROB_MEAS"] # Python 3.8 in Windows + # os.unsetenv("PRL_PROB_MEAS") # SInce Python 3.9 self.assertDictAlmostEqual( result1.get_counts(circuit), result2_prl.get_counts(circuit), delta=0.1 * shots From fa608fc0e03921789dc7c96ab1d45ca8e0daeb6e Mon Sep 17 00:00:00 2001 From: Jun Doi Date: Fri, 6 Oct 2023 17:36:17 +0900 Subject: [PATCH 5/5] Update releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml Co-authored-by: merav-aharoni --- ...parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml b/releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml index 980f979f88..1ed6a7ba01 100644 --- a/releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml +++ b/releasenotes/notes/parallel-probabilistic-measurement-mps-ec00a896a0322213.yaml @@ -2,4 +2,4 @@ upgrade: - | Improve performance in MPS measurement method ``matrix_product_state::sample_measure_all`` - parallelizing the shots. + by parallelizing the shots.