Sequential Quantum Gate Decomposer  v1.9.6
Powerful decomposition of general unitarias into one- and two-qubit gates gates
apply_large_kernel_to_input_AVX.h
Go to the documentation of this file.
1 /*
2 Created on Fri Jun 26 14:13:26 2020
3 Copyright 2020 Peter Rakyta, Ph.D.
4 
5 Licensed under the Apache License, Version 2.0 (the "License");
6 you may not use this file except in compliance with the License.
7 You may obtain a copy of the License at
8 
9  http://www.apache.org/licenses/LICENSE-2.0
10 
11 Unless required by applicable law or agreed to in writing, software
12 distributed under the License is distributed on an "AS IS" BASIS,
13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 See the License for the specific language governing permissions and
15 limitations under the License.
16 
17 @author: Peter Rakyta, Ph.D.
18 */
24 #ifndef apply_large_kernel_to_input_AVX_H
25 #define apply_large_kernel_to_input_AVX_H
26 
27 #include <immintrin.h>
28 #include "matrix.h"
29 #include "matrix_float.h"
30 #include "common.h"
31 
33 
34 //AVX auxiliary functions
35 
42 __m256d get_AVX_vector(double* element_outer, double* element_inner);
43 
51 __m256d complex_mult_AVX(__m256d input_vec, __m256d unitary_row_vec, __m256d neg);
52 
53 //main function to call
54 
62 void apply_large_kernel_to_input_AVX(Matrix& unitary, Matrix& input, std::vector<int> involved_qbits, const int& matrix_size);
63 void apply_large_kernel_from_right_AVX(Matrix& unitary, Matrix& input, std::vector<int> involved_qbits, const int& matrix_size);
64 
72 void apply_large_kernel_to_input_AVX_OpenMP(Matrix& unitary, Matrix& input, std::vector<int> involved_qbits, const int& matrix_size);
73 void apply_large_kernel_from_right_AVX_OpenMP(Matrix& unitary, Matrix& input, std::vector<int> involved_qbits, const int& matrix_size);
74 
82 void apply_large_kernel_to_input_AVX_TBB(Matrix& unitary, Matrix& input, std::vector<int> involved_qbits, const int& matrix_size);
83 void apply_large_kernel_from_right_AVX_TBB(Matrix& unitary, Matrix& input, std::vector<int> involved_qbits, const int& matrix_size);
84 
85 // general N qubit kernel functions
86 
95 inline void get_block_indices(int N, const std::vector<int> &tq, const std::vector<int> &non_targets,int iter_idx, std::vector<int> &indices);
96 
105 inline void get_block_indices_fast(int iter_idx, const std::vector<int>& target_qubits, const std::vector<int>& non_targets, const std::vector<int>& block_pattern, std::vector<int>& indices);
106 
113 void precompute_index_mapping(const std::vector<int>& target_qubits, const std::vector<int>& non_targets, std::vector<int>& block_pattern);
114 
121 inline __m256d* construct_mv_xy_vectors(const Matrix& gate_kernel_unitary, const int& matrix_size);
122 
130 void apply_2qbit_kernel_to_matrix_input_parallel_AVX_OpenMP(Matrix& two_qbit_unitary, Matrix& input, std::vector<int> involved_qbits, const int& matrix_size);
131 
132 
133 // CROT Kernels
134 
144 void apply_crot_kernel_to_matrix_input_AVX_parallel(Matrix& u3_1qbit1,Matrix& u3_1qbit2,Matrix& input, const int& target_qbit, const int& control_qbit, const int& matrix_size);
145 void apply_crot_kernel_to_matrix_input_from_right_AVX_parallel(Matrix& u3_1qbit1,Matrix& u3_1qbit2,Matrix& input, const int& target_qbit, const int& control_qbit, const int& matrix_size);
146 
156 void apply_crot_kernel_to_matrix_input_AVX(Matrix& u3_1qbit1, Matrix& u3_qbit2, Matrix& input, const int& target_qbit, const int& control_qbit, const int& matrix_size);
157 void apply_crot_kernel_to_matrix_input_from_right_AVX(Matrix& u3_1qbit1, Matrix& u3_qbit2, Matrix& input, const int& target_qbit, const int& control_qbit, const int& matrix_size);
158 
159 void apply_large_kernel_to_input_AVX32(Matrix_float& unitary, Matrix_float& input, std::vector<int> involved_qbits, const int& matrix_size);
160 void apply_large_kernel_to_input_AVX_OpenMP32(Matrix_float& unitary, Matrix_float& input, std::vector<int> involved_qbits, const int& matrix_size);
161 void apply_large_kernel_to_input_AVX_TBB32(Matrix_float& unitary, Matrix_float& input, std::vector<int> involved_qbits, const int& matrix_size);
162 void apply_large_kernel_from_right_AVX32(Matrix_float& unitary, Matrix_float& input, std::vector<int> involved_qbits, const int& matrix_size);
163 void apply_large_kernel_from_right_AVX_OpenMP32(Matrix_float& unitary, Matrix_float& input, std::vector<int> involved_qbits, const int& matrix_size);
164 void apply_large_kernel_from_right_AVX_TBB32(Matrix_float& unitary, Matrix_float& input, std::vector<int> involved_qbits, const int& matrix_size);
165 
166 void apply_2qbit_kernel_to_matrix_input_parallel_AVX_OpenMP32(Matrix_float& two_qbit_unitary, Matrix_float& input, std::vector<int> involved_qbits, const int& matrix_size);
167 
168 void apply_crot_kernel_to_matrix_input_AVX_parallel32(Matrix_float& u3_1qbit1, Matrix_float& u3_1qbit2, Matrix_float& input, const int& target_qbit, const int& control_qbit, const int& matrix_size);
169 void apply_crot_kernel_to_matrix_input_AVX32(Matrix_float& u3_1qbit1, Matrix_float& u3_qbit2, Matrix_float& input, const int& target_qbit, const int& control_qbit, const int& matrix_size);
170 void apply_crot_kernel_to_matrix_input_from_right_AVX_parallel32(Matrix_float& u3_1qbit1, Matrix_float& u3_1qbit2, Matrix_float& input, const int& target_qbit, const int& control_qbit, const int& matrix_size);
171 void apply_crot_kernel_to_matrix_input_from_right_AVX32(Matrix_float& u3_1qbit1, Matrix_float& u3_qbit2, Matrix_float& input, const int& target_qbit, const int& control_qbit, const int& matrix_size);
172 #endif
Header file of single-precision complex array storage with automatic and thread safe reference counti...
void get_block_indices_fast(int iter_idx, const std::vector< int > &target_qubits, const std::vector< int > &non_targets, const std::vector< int > &block_pattern, std::vector< int > &indices)
Efficiently compute the indices for a given block using precomputed patterns.
void apply_crot_kernel_to_matrix_input_from_right_AVX_parallel(Matrix &u3_1qbit1, Matrix &u3_1qbit2, Matrix &input, const int &target_qbit, const int &control_qbit, const int &matrix_size)
void apply_crot_kernel_to_matrix_input_AVX(Matrix &u3_1qbit1, Matrix &u3_qbit2, Matrix &input, const int &target_qbit, const int &control_qbit, const int &matrix_size)
Apply controlled rotation (CROT) kernel to a matrix input using AVX optimization. ...
void apply_large_kernel_to_input_AVX32(Matrix_float &unitary, Matrix_float &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_large_kernel_to_input_AVX_OpenMP32(Matrix_float &unitary, Matrix_float &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_large_kernel_from_right_AVX_TBB(Matrix &unitary, Matrix &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_2qbit_kernel_to_matrix_input_parallel_AVX_OpenMP(Matrix &two_qbit_unitary, Matrix &input, std::vector< int > involved_qbits, const int &matrix_size)
Apply two-qubit gate kernel to an input matrix using AVX optimization and OpenMP parallelization.
void apply_crot_kernel_to_matrix_input_from_right_AVX_parallel32(Matrix_float &u3_1qbit1, Matrix_float &u3_1qbit2, Matrix_float &input, const int &target_qbit, const int &control_qbit, const int &matrix_size)
__m256d complex_mult_AVX(__m256d input_vec, __m256d unitary_row_vec, __m256d neg)
Perform complex multiplication using AVX intrinsics.
void apply_large_kernel_from_right_AVX_OpenMP(Matrix &unitary, Matrix &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_large_kernel_from_right_AVX_OpenMP32(Matrix_float &unitary, Matrix_float &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_crot_kernel_to_matrix_input_AVX_parallel(Matrix &u3_1qbit1, Matrix &u3_1qbit2, Matrix &input, const int &target_qbit, const int &control_qbit, const int &matrix_size)
Apply controlled rotation (CROT) kernel to a matrix input using AVX optimization and parallel process...
void apply_large_kernel_from_right_AVX32(Matrix_float &unitary, Matrix_float &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_crot_kernel_to_matrix_input_from_right_AVX(Matrix &u3_1qbit1, Matrix &u3_qbit2, Matrix &input, const int &target_qbit, const int &control_qbit, const int &matrix_size)
matrix_size
[load Umtx]
Definition: example.py:58
void precompute_index_mapping(const std::vector< int > &target_qubits, const std::vector< int > &non_targets, std::vector< int > &block_pattern)
Precompute the index mapping for target and non-target qubits.
Header file of complex array storage array with automatic and thread safe reference counting...
__m256d get_AVX_vector(double *element_outer, double *element_inner)
Helper function to load and prepare AVX vectors with outer and inner elements for complex multiplicat...
void apply_crot_kernel_to_matrix_input_AVX32(Matrix_float &u3_1qbit1, Matrix_float &u3_qbit2, Matrix_float &input, const int &target_qbit, const int &control_qbit, const int &matrix_size)
void apply_large_kernel_to_input_AVX(Matrix &unitary, Matrix &input, std::vector< int > involved_qbits, const int &matrix_size)
Apply multi-qubit gate kernel to an input matrix using AVX optimization.
Double-precision complex matrix (float64).
Definition: matrix.h:38
void apply_large_kernel_from_right_AVX(Matrix &unitary, Matrix &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_large_kernel_to_input_AVX_TBB(Matrix &unitary, Matrix &input, std::vector< int > involved_qbits, const int &matrix_size)
Apply multi-qubit gate kernel to an input matrix using AVX optimization and TBB parallelization.
Single-precision complex matrix (float32).
Definition: matrix_float.h:41
void apply_crot_kernel_to_matrix_input_from_right_AVX32(Matrix_float &u3_1qbit1, Matrix_float &u3_qbit2, Matrix_float &input, const int &target_qbit, const int &control_qbit, const int &matrix_size)
__m256d * construct_mv_xy_vectors(const Matrix &gate_kernel_unitary, const int &matrix_size)
Precompute AVX vectors for the unitary matrix to optimize complex multiplication. ...
void get_block_indices(int N, const std::vector< int > &tq, const std::vector< int > &non_targets, int iter_idx, std::vector< int > &indices)
Compute the indices for a given block in the quantum state.
void apply_large_kernel_to_input_AVX_TBB32(Matrix_float &unitary, Matrix_float &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_2qbit_kernel_to_matrix_input_parallel_AVX_OpenMP32(Matrix_float &two_qbit_unitary, Matrix_float &input, std::vector< int > involved_qbits, const int &matrix_size)
Header file for commonly used functions and wrappers to CBLAS functions.
void apply_large_kernel_from_right_AVX_TBB32(Matrix_float &unitary, Matrix_float &input, std::vector< int > involved_qbits, const int &matrix_size)
void apply_large_kernel_to_input_AVX_OpenMP(Matrix &unitary, Matrix &input, std::vector< int > involved_qbits, const int &matrix_size)
Apply multi-qubit gate kernel to an input matrix using AVX optimization and OpenMP parallelization...
void apply_crot_kernel_to_matrix_input_AVX_parallel32(Matrix_float &u3_1qbit1, Matrix_float &u3_1qbit2, Matrix_float &input, const int &target_qbit, const int &control_qbit, const int &matrix_size)