diff options
| author | hachem <im@hachem.wtf> | 2026-09-20 18:37:48 +0200 |
|---|---|---|
| committer | hachem <im@hachem.wtf> | 2026-09-20 18:37:48 +0200 |
| commit | a136c80d978841d317a6ad3930b9e608fdba1586 (patch) | |
| tree | 7dde0e0372f60125bd7cb5f851f22efb01be703b /src/maths/simd.c | |
| parent | e1f5c41c35fe26fddf5163ec06f78efd61ad35f4 (diff) | |
Diffstat (limited to 'src/maths/simd.c')
| -rw-r--r-- | src/maths/simd.c | 34 |
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); } |
