aboutsummaryrefslogtreecommitdiff
path: root/src/maths/simd.c
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-09-20 18:37:48 +0200
committerhachem <im@hachem.wtf>2026-09-20 18:37:48 +0200
commita136c80d978841d317a6ad3930b9e608fdba1586 (patch)
tree7dde0e0372f60125bd7cb5f851f22efb01be703b /src/maths/simd.c
parente1f5c41c35fe26fddf5163ec06f78efd61ad35f4 (diff)
feat: add pthread parallel executionHEADmain
Diffstat (limited to 'src/maths/simd.c')
-rw-r--r--src/maths/simd.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/maths/simd.c b/src/maths/simd.c
index fc25de8..5daebbb 100644
--- a/src/maths/simd.c
+++ b/src/maths/simd.c
@@ -3,6 +3,8 @@
#include <assert.h>
#include <stdlib.h>
+#include "parallel.h"
+
#if defined(__x86_64__) || defined(__i386__)
#include <immintrin.h>
#elif defined(__aarch64__)
@@ -316,9 +318,39 @@ void psi_apply_single_qubit_gate_simd(struct PsiComplex* state, const struct Psi
apply_scalar(state, gate, target, num_qubits);
}
+struct PsiSimdPairs
+{
+ struct PsiComplex* state;
+ size_t (*pairs)[2];
+ struct PsiComplex g00;
+ struct PsiComplex g01;
+ struct PsiComplex g10;
+ struct PsiComplex g11;
+};
+
+static void simd_pair_range(size_t start, size_t end, void* vctx)
+{
+ struct PsiSimdPairs* c = vctx;
+
+ for (size_t p = start; p < end; p++)
+ apply_pair(c->state, c->pairs[p][0], c->pairs[p][1], c->g00, c->g01, c->g10, c->g11);
+}
+
void psi_apply_single_qubit_gate_simd_parallel(struct PsiComplex* state,
const struct PsiComplex gate[2][2], size_t target,
size_t num_qubits)
{
- apply_scalar(state, gate, target, num_qubits);
+ size_t target_bit = num_qubits - 1 - target;
+ size_t step = (size_t)1 << target_bit;
+ size_t dim = (size_t)1 << num_qubits;
+
+ size_t np;
+ size_t (*pairs)[2] = build_pairs(dim, target_bit, step, &np);
+
+ struct PsiSimdPairs ctx = {
+ state, pairs, gate[0][0], gate[0][1], gate[1][0], gate[1][1],
+ };
+ psi_parallel_for(np, simd_pair_range, &ctx);
+
+ free(pairs);
}