From 8066223d25be51627416fb7a05c5234d8c499e55 Mon Sep 17 00:00:00 2001 From: hachem Date: Wed, 10 Dec 2025 09:26:56 +0100 Subject: [add]: simd --- libpsi-core/src/core/kernel.rs | 44 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'libpsi-core/src/core/kernel.rs') diff --git a/libpsi-core/src/core/kernel.rs b/libpsi-core/src/core/kernel.rs index 3d75425..9f65d09 100644 --- a/libpsi-core/src/core/kernel.rs +++ b/libpsi-core/src/core/kernel.rs @@ -1,3 +1,6 @@ +use crate::maths::simd::{ + apply_single_qubit_gate_simd, apply_single_qubit_gate_simd_parallel, SimdCapability, +}; use crate::{complex, Complex, Matrix}; use rayon::prelude::*; @@ -108,6 +111,47 @@ impl KernelBatch { *state = apply_kernel_parallel(state, kernel, self.num_qubits); } } + + pub fn execute_simd(&self, state: &mut Vec>) { + for kernel in &self.kernels { + if kernel.targets.len() == 1 { + let gate = matrix_to_2x2(&kernel.matrix); + apply_single_qubit_gate_simd(state, &gate, kernel.targets[0], self.num_qubits); + } else { + *state = apply_kernel(state, kernel, self.num_qubits); + } + } + } + + pub fn execute_simd_parallel(&self, state: &mut Vec>) { + for kernel in &self.kernels { + if kernel.targets.len() == 1 && self.num_qubits >= 10 { + let gate = matrix_to_2x2(&kernel.matrix); + apply_single_qubit_gate_simd_parallel( + state, + &gate, + kernel.targets[0], + self.num_qubits, + ); + } else if kernel.targets.len() == 1 { + let gate = matrix_to_2x2(&kernel.matrix); + apply_single_qubit_gate_simd(state, &gate, kernel.targets[0], self.num_qubits); + } else { + *state = apply_kernel_parallel(state, kernel, self.num_qubits); + } + } + } + + pub fn simd_capability(&self) -> SimdCapability { + SimdCapability::detect() + } +} + +fn matrix_to_2x2(matrix: &Matrix>) -> [[Complex; 2]; 2] { + [ + [matrix.data[0], matrix.data[1]], + [matrix.data[2], matrix.data[3]], + ] } fn apply_kernel(state: &[Complex], kernel: &Kernel, num_qubits: usize) -> Vec> { -- cgit v1.3